diff --git a/core/file/png.cpp b/core/file/png.cpp index 5acb3d4b41..8033f4326c 100644 --- a/core/file/png.cpp +++ b/core/file/png.cpp @@ -183,6 +183,7 @@ namespace MR bit_depth (0), filename (filename), data_type (H.datatype()), + multiplier (1.0), outfile (NULL) { if (Path::exists (filename) && !App::overwrite_files) @@ -231,17 +232,23 @@ namespace MR png_destroy_write_struct (&png_ptr, &info_ptr); throw Exception ("Undefined data type in image \"" + H.name() + "\" for PNG writer"); case DataType::Bit: - bit_depth = 1; + assert (false); break; case DataType::UInt8: + bit_depth = 8; + break; case DataType::Float32: bit_depth = 8; + multiplier = std::numeric_limits::max(); break; break; case DataType::UInt16: case DataType::UInt32: case DataType::UInt64: + bit_depth = 16; + break; case DataType::Float64: bit_depth = 16; + multiplier = std::numeric_limits::max(); break; break; } // Detect cases where one axis has a size of 1, and hence represents the image plane @@ -327,7 +334,7 @@ namespace MR }; - if (bit_depth == 1 || data_type == DataType::UInt8 || data_type == DataType::UInt16BE) { + if (data_type == DataType::UInt8 || data_type == DataType::UInt16BE) { finish (data); } else { uint8_t scratch[row_bytes * height]; diff --git a/core/file/png.h b/core/file/png.h index 7a1d6b59ec..c0a5e65e69 100644 --- a/core/file/png.h +++ b/core/file/png.h @@ -83,6 +83,7 @@ namespace MR int color_type, bit_depth; std::string filename; DataType data_type; + default_type multiplier; FILE* outfile; static void error_handler (png_struct_def*, const char*); @@ -100,16 +101,8 @@ namespace MR std::function fetch_func; std::function store_func; __set_fetch_store_functions (fetch_func, store_func, data_type); - default_type multiplier = 1.0; - switch (data_type() & DataType::Type) { - case DataType::Float32: multiplier = std::numeric_limits::max(); break; - case DataType::Float64: multiplier = std::numeric_limits::max(); break; - } - for (size_t i = 0; i != num_elements; ++i) { - Raw::store_BE (std::min (default_type(std::numeric_limits::max()), std::max (0.0, std::round(multiplier * fetch_func (in_ptr, 0, 0.0, 1.0)))), out_ptr); - in_ptr += data_type.bytes(); - out_ptr += sizeof(T); - } + for (size_t i = 0; i != num_elements; ++i) + Raw::store_BE (std::min (default_type(std::numeric_limits::max()), std::max (0.0, std::round(multiplier * fetch_func (in_ptr, i, 0.0, 1.0)))), out_ptr, i); }; diff --git a/core/formats/png.cpp b/core/formats/png.cpp index 3e5b2654a9..54e74c42e7 100644 --- a/core/formats/png.cpp +++ b/core/formats/png.cpp @@ -149,7 +149,8 @@ namespace MR // - 4 volumes (save as RGBA) // This needs to be compatible with NameParser used in Header::create(): // "num_axes" subtracts from H.ndim() however many instances of [] there are - size_t width_axis = 0, axis_to_zero = 3; + // size_t width_axis = 0; + size_t axis_to_zero = 3; if (H.ndim() - num_axes > 1) throw Exception ("Cannot nominate more than one axis using square-bracket notation for PNG format"); switch (num_axes) { @@ -170,7 +171,7 @@ namespace MR axis_to_zero = 1; } else if (H.size(0) == 1) { axis_to_zero = 0; - width_axis = 1; + //width_axis = 1; } else { // If image is 3D, and all three axes have size greater than one, and we // haven't used the square-bracket notation, we can't export genuine 3D data @@ -192,8 +193,8 @@ namespace MR } if (axis < 0) throw Exception ("Cannot export 4D image to PNG format if all three spatial axes have size greater than 1 and square-bracket notation is not used"); - if (!axis_to_zero) - width_axis = 1; + // if (!axis_to_zero) + // width_axis = 1; break; default: throw Exception ("Cannot generate PNG file(s) from image with more than 4 axes"); @@ -223,9 +224,10 @@ namespace MR H.transform().setIdentity(); - if (H.datatype() == DataType::Bit && H.size (width_axis) % 8) { - WARN ("Cannot write bitwise PNG image with width not a factor of 8; will instead write with 8-bit depth"); + if (H.datatype() == DataType::Bit) { + WARN ("Cannot write bitwise PNG images; will instead write with 8-bit depth"); H.datatype() = DataType::UInt8; + H.intensity_scale() = 1.0 / 255.0; } return true; diff --git a/testing/binaries/data b/testing/binaries/data index e5646b6b5a..68869a7fe0 160000 --- a/testing/binaries/data +++ b/testing/binaries/data @@ -1 +1 @@ -Subproject commit e5646b6b5a5311df287610c1b0ea4e13388d6740 +Subproject commit 68869a7fe0780c7b1e9577ba68466d5b407a3fe8 diff --git a/testing/binaries/tests/mrconvert b/testing/binaries/tests/mrconvert index 8d3f6d2f96..b17770093e 100644 --- a/testing/binaries/tests/mrconvert +++ b/testing/binaries/tests/mrconvert @@ -16,4 +16,9 @@ mrconvert mrcat/voxel[].mih - | testing_diff_header -keyval - mrcat/all_axis0.mi mrconvert mrcat/all_axis3.mif tmp-[].mif -force && testing_diff_header -keyval tmp-0.mif mrcat/voxel1.mih && testing_diff_header -keyval tmp-1.mif mrcat/voxel2.mih && testing_diff_header -keyval tmp-2.mif mrcat/voxel3.mih && testing_diff_header -keyval tmp-3.mif mrcat/voxel4.mih && testing_diff_header -keyval tmp-4.mif mrcat/voxel5.mih && testing_diff_header -keyval tmp-5.mif mrcat/voxel6.mih mrconvert dwi.mif tmp-[]-[].mif -force && testing_diff_image dwi.mif tmp-[]-[].mif mrconvert dwi.mif -coord 3 1:2:end -axes 0:2,-1,3 - | testing_diff_image - mrconvert/dwi_select_axes.mif - +mrinfo template.mif.gz -transform > tmp.txt && mrconvert template.mif.gz tmp[].png -force && mrconvert tmp[].png -vox 2.5 - | mrtransform - -replace tmp.txt - | mrcalc - 255 -div - | testing_diff_image - $(mrcalc template.mif.gz 1.0 -min -) -abs 0.002 +rm -f tmpaxial*.png && mrconvert template.mif.gz -coord 2 9,19,29,39,49 tmpaxial[].png && testing_diff_image tmpaxial[].png mrconvert/axial[].png +rm -f tmpcoronal*.png && mrconvert template.mif.gz -coord 1 17,32,47,62,77 -axes 0,2,1 tmpcoronal[].png && testing_diff_image tmpcoronal[].png mrconvert/coronal[].png +rm -f tmpsagittal*.png && mrconvert template.mif.gz -coord 0 27,47,67 -axes 1,2,0 tmpsagittal[].png && testing_diff_image tmpsagittal[].png mrconvert/sagittal[].png +rm -f tmpmask*.png && mrconvert mask.mif tmpmask[].png && testing_diff_image tmpmask[].png mrconvert/mask[].png +rm -f tmptissues*.png && mrconvert dwi2fod/msmt/tissues.mif tmptissues[].png && testing_diff_image tmptissues[].png mrconvert/tissues[].png