imread.m fails reading/writing 16bit images correctly
Benjamin Lindner
lindnerben at gmx.net
Mon Jun 29 07:01:42 CDT 2009
Hello,
using current development sources on mingw32, together with
graphicsmagick-1.3.5 configured with --quantum-depth=16, imread does not
correctly read 16bit images.
octave.exe:2:C:\> imwrite(uint16(12345),"test.tiff");
octave.exe:3:C:\> img=imread("test.tiff")
img = 48
octave.exe:4:C:\> class(img)
ans = uint8
octave.exe:5:C:\> imfinfo("test.tiff")
ans =
{
Filename = C:\test.tiff
FileSize = 261
Height = 1
Width = 1
BitDepth = 16
Format = TIFF
LongFormat = Tagged Image File Format
XResolution = 0
YResolution = 0
TotalColors = 1
TileName =
AnimationDelay = 0
AnimationIterations = 0
ByteOrder = undefined
Gamma = 0
Matte = 0
ModulusDepth = 13
Quality = 75
QuantizeColors = 256
ResolutionUnits = undefined
ColorType = grayscale
View =
FileModDate = 29-Jun-2009 11:40:51
}
The reason (I believe) is that __magick_read__.cc (staring at line 418)
determines from ModulusDepth the number of bits required to store image data
into incorrectly.
With the above Modulusdepth=13, the calculated bitdepth is 8, when it should
be 16.
The attached changeset fixes this, but it still does not work correctly.
octave.exe:5:C:\> imwrite(uint16([12345,12346,12347]), "test2.tiff");
octave.exe:6:C:\> img=imread("test2.tiff")
img =
12344 12345 12346
the values read are off-by-1.
And apparently they are already written off-by-1
c:\> tiffinfo -d test2.tiff
TIFF Directory at offset 0xe (14)
Image Width: 3 Image Length: 1
Bits/Sample: 16
Sample Format: unsigned integer
Compression Scheme: None
Photometric Interpretation: min-is-black
Samples/Pixel: 1
Rows/Strip: 1365
Planar Configuration: single image plane
Page Number: 0-1
DocumentName: test2.tiff
Software: GraphicsMagick 1.3.5 2009-01-26 Q16 http://www.GraphicsMagick.org/
Strip 0:
38 30 39 30 3a 30
and 0x3038 equals 12344 decimal, so something's wrong at creating the image file
I couldn't yet figure out why this is so.
Can someone confirm this behavoiur?
benjamin
--
GRATIS für alle GMX-Mitglieder: Die maxdome Movie-FLAT!
Jetzt freischalten unter http://portal.gmx.net/de/go/maxdome01
-------------- next part --------------
# HG changeset patch
# User Benjamin Lindner <lindnerb at users.sourceforge.net>
# Date 1246274961 -7200
# Node ID c39f66e65f188f1f405f6ed74bb8c3b757e2a203
# Parent 34c8e1d9c9c273e10ad7f6cc9fdd8ddd5db6ed77
determine correct image bitwidth in __magick_read__.cc
diff -r 34c8e1d9c9c2 -r c39f66e65f18 src/ChangeLog
--- a/src/ChangeLog Thu Jun 25 09:44:06 2009 +0200
+++ b/src/ChangeLog Mon Jun 29 13:29:21 2009 +0200
@@ -1,3 +1,8 @@
+2009-06-29 Benjamin Lindner <lindnerb at users.sourceforge.net>
+
+ * DLD-FUNCTIONS/__magick_read__.cc (F__magick_read__): Determine correct number
+ of bits required when reading images.
+
2009-06-14 Jaroslav Hajek <highegg at gmail.com>
* DLD-FUNCTIONS/lookup.cc (Flookup): Support character array lookup.
diff -r 34c8e1d9c9c2 -r c39f66e65f18 src/DLD-FUNCTIONS/__magick_read__.cc
--- a/src/DLD-FUNCTIONS/__magick_read__.cc Thu Jun 25 09:44:06 2009 +0200
+++ b/src/DLD-FUNCTIONS/__magick_read__.cc Mon Jun 29 13:29:21 2009 +0200
@@ -416,11 +416,15 @@
else
{
unsigned int depth = imvec[0].modulusDepth ();
- int i = 0;
- while (depth >>= 1)
- i++;
- depth = 1 << i;
-
+ if (depth > 1)
+ {
+ --depth;
+ int i = 1;
+ while (depth >>= 1)
+ i++;
+ depth = 1 << i;
+ }
+
switch (depth)
{
case 1:
More information about the Bug-octave
mailing list