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