<?xml version="1.0" encoding="iso-8859-9" ?>
<?xml-stylesheet type="text/xsl" href="RSS_xslt_style.asp" version="1.0" ?>
<rss version="2.0" xmlns:WebWizForums="http://syndication.webwizguide.com/rss_namespace/">
 <channel>
  <title>Datakent Forum : leptonica read bmp with use pixReadMem function</title>
  <link>http://forum.datakent.com/</link>
  <description>XML içerik linki; Datakent Forum : C, C++, Visual C++ : leptonica read bmp with use pixReadMem function</description>
  <pubDate>Mon, 27 Apr 2026 14:51:07 +0000</pubDate>
  <lastBuildDate>Sun, 09 Dec 2012 12:35:28 +0000</lastBuildDate>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Web Wiz Forums 9.54</generator>
  <ttl>360</ttl>
  <WebWizForums:feedURL>forum.datakent.com/RSS_post_feed.asp?TID=2465</WebWizForums:feedURL>
  <image>
   <title>Datakent Forum</title>
   <url>http://forum.datakent.com/forum_images/datakent.com_forums.png</url>
   <link>http://forum.datakent.com/</link>
  </image>
  <item>
   <title>leptonica read bmp with use pixReadMem function : leptonica - bmpio.c//---------...</title>
   <link>http://forum.datakent.com/forum_posts.asp?TID=2465&amp;PID=5168#5168</link>
   <description>
    <![CDATA[<strong>Yazar:</strong> <a href="http://forum.datakent.com/member_profile.asp?PF=4094" rel="nofollow">aziz.alkurt</a><br /><strong>Konu:</strong> 2465<br /><strong>Gönderim Zamanı:</strong> 09.Aralik.2012 Saat 12:35<br /><br />leptonica - bmpio.c<br>//----------------------------------------------------------------------------------------------------------------------<br>PIX *<br>pixReadMemBmp(const l_uint8&nbsp; *cdata,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size)<br>{<br>&nbsp;&nbsp;&nbsp; int hacked;<br>&nbsp;&nbsp;&nbsp; l_uint16&nbsp;&nbsp; sval;<br>&nbsp;&nbsp;&nbsp; l_uint32&nbsp;&nbsp; ival;<br>&nbsp;&nbsp;&nbsp; l_int16&nbsp;&nbsp;&nbsp; bfType, bfSize, bfFill1, bfReserved1, bfReserved2;<br>&nbsp;&nbsp;&nbsp; l_int16&nbsp;&nbsp;&nbsp; offset, bfFill2, biPlanes, depth, d;<br>&nbsp;&nbsp;&nbsp; l_int32&nbsp;&nbsp;&nbsp; biSize, width, height, xres, yres, compression, ignore;<br>&nbsp;&nbsp;&nbsp; l_int32&nbsp;&nbsp;&nbsp; imagebytes, biClrUsed, biClrImportant;<br>&nbsp;&nbsp;&nbsp; l_uint8&nbsp;&nbsp; *colormapBuf;<br>&nbsp;&nbsp;&nbsp; l_int32&nbsp;&nbsp;&nbsp; colormapEntries;<br>&nbsp;&nbsp;&nbsp; l_int32&nbsp;&nbsp;&nbsp; fileBpl, extrabytes, readerror;<br>&nbsp;&nbsp;&nbsp; l_int32&nbsp;&nbsp;&nbsp; pixWpl, pixBpl;<br>&nbsp;&nbsp;&nbsp; l_int32&nbsp;&nbsp;&nbsp; i, j, k;<br>&nbsp;&nbsp;&nbsp; l_uint8&nbsp;&nbsp;&nbsp; pel&#091;4&#093;;<br>&nbsp;&nbsp;&nbsp; l_uint8&nbsp;&nbsp; *data;<br>&nbsp;&nbsp;&nbsp; l_uint32&nbsp; *line, *pword;<br>&nbsp;&nbsp;&nbsp; PIX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pix, *pixt;<br>&nbsp;&nbsp;&nbsp; PIXCMAP&nbsp;&nbsp; *cmap;<br>&nbsp;&nbsp;&nbsp; PROCNAME("pixReadMemBmp");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Read bitmap file header */<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata,2);<br>&nbsp;&nbsp;&nbsp; bfType = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; if (bfType != BMP_ID)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("not bmf format", procName, NULL);<br><br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+2,2);<br>&nbsp;&nbsp;&nbsp; bfSize = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+4,2);<br>&nbsp;&nbsp;&nbsp; bfFill1 = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+6,2);<br>&nbsp;&nbsp;&nbsp; bfReserved1 = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+8,2);<br>&nbsp;&nbsp;&nbsp; bfReserved2 = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+10,2);<br>&nbsp;&nbsp;&nbsp; offset = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+12,2);<br>&nbsp;&nbsp;&nbsp; bfFill2 = convertOnBigEnd16(sval);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Read bitmap info header */<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+14,4);<br>&nbsp;&nbsp;&nbsp; biSize = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+18,4);<br>&nbsp;&nbsp;&nbsp; width = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+22,4);<br>&nbsp;&nbsp;&nbsp; height = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+26,2);<br>&nbsp;&nbsp;&nbsp; biPlanes = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;sval,(char *)cdata+28,2);<br>&nbsp;&nbsp;&nbsp; depth = convertOnBigEnd16(sval);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+30,4);<br>&nbsp;&nbsp;&nbsp; compression = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+34,4);<br>&nbsp;&nbsp;&nbsp; imagebytes = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+38,4);<br>&nbsp;&nbsp;&nbsp; xres = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+42,4);<br>&nbsp;&nbsp;&nbsp; yres = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+46,4);<br>&nbsp;&nbsp;&nbsp; biClrUsed = convertOnBigEnd32(ival);<br>&nbsp;&nbsp;&nbsp; memcpy((char *)&amp;ival,(char *)cdata+50,4);<br>&nbsp;&nbsp;&nbsp; biClrImportant = convertOnBigEnd32(ival);<br><br>&nbsp;&nbsp;&nbsp; if (compression != 0)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("cannot read compressed BMP files",<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; procName,NULL);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* A little sanity checking.&nbsp; It would be nice to check<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * if the number of bytes in the file equals the offset to<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * the data plus the imagedata, but this won't work when<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * reading from memory, because fmemopen() doesn't implement<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * ftell().&nbsp; So we can't do that check.&nbsp; The imagebytes for<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * uncompressed images is either 0 or the size of the file data.<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * (The fact that it can be 0 is perhaps some legacy glitch).&nbsp; */<br>&nbsp;&nbsp;&nbsp; if (width &lt; 1)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("width &lt; 1", procName,NULL);<br>&nbsp;&nbsp;&nbsp; if (height &lt; 1)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("height &lt; 1", procName,NULL);<br>&nbsp;&nbsp;&nbsp; if (depth &lt; 1 || depth &gt; 32)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("depth not in &#091;1 ... 32&#093;", procName,NULL);<br>&nbsp;&nbsp;&nbsp; fileBpl = 4 * ((width * depth + 31)/32);<br>&nbsp;&nbsp;&nbsp; if (imagebytes != 0 &amp;&amp; imagebytes != fileBpl * height)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("invalid imagebytes", procName,NULL);<br>&nbsp;&nbsp;&nbsp; if (offset &lt; BMP_FHBYTES + BMP_IHBYTES)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("invalid offset: too small", procName,NULL);<br>&nbsp;&nbsp;&nbsp; if (offset &gt; BMP_FHBYTES + BMP_IHBYTES + 4 * 256)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("invalid offset: too large", procName,NULL);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Handle the colormap */<br>&nbsp;&nbsp;&nbsp; colormapEntries = (offset - BMP_FHBYTES - BMP_IHBYTES) / sizeof(RGBA_QUAD);<br>&nbsp;&nbsp;&nbsp; if (colormapEntries &gt; 0) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ((colormapBuf = (l_uint8 *)CALLOC(colormapEntries,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sizeof(RGBA_QUAD))) == NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("colormapBuf alloc fail", procName, NULL );<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Read colormap */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (54+colormapEntries&gt;size)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FREE(colormapBuf);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR( "colormap read fail", procName, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(colormapBuf,(char *)cdata+54,colormapEntries);<br><br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Make a 32 bpp pix if depth is 24 bpp */<br>&nbsp;&nbsp;&nbsp; d = depth;<br>&nbsp;&nbsp;&nbsp; if (depth == 24)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; d = 32;<br>&nbsp;&nbsp;&nbsp; if ((pix = pixCreate(width, height, d)) == NULL)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR( "pix not made", procName, NULL);<br>&nbsp;&nbsp;&nbsp; pixSetXRes(pix, (l_int32)((l_float32)xres / 39.37 + 0.5));&nbsp; /* to ppi */<br>&nbsp;&nbsp;&nbsp; pixSetYRes(pix, (l_int32)((l_float32)yres / 39.37 + 0.5));&nbsp; /* to ppi */<br>&nbsp;&nbsp;&nbsp; pixWpl = pixGetWpl(pix);<br>&nbsp;&nbsp;&nbsp; pixBpl = 4 * pixWpl;<br><br>&nbsp;&nbsp;&nbsp; cmap = NULL;<br>&nbsp;&nbsp;&nbsp; if (colormapEntries &gt; 256)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; L_WARNING("more than 256 colormap entries!", procName);<br>&nbsp;&nbsp;&nbsp; if (colormapEntries &gt; 0) {&nbsp; /* import the colormap to the pix cmap */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmap = pixcmapCreate(L_MIN(d, 8));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FREE(cmap-&gt;array);&nbsp; /* remove generated cmap array */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmap-&gt;array&nbsp; = (void *)colormapBuf;&nbsp; /* and replace */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmap-&gt;n = L_MIN(colormapEntries, 256);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; pixSetColormap(pix, cmap);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* Seek to the start of the bitmap in the file */<br>&nbsp;&nbsp;&nbsp; /*fseek(fp, offset, 0);*/<br>&nbsp;&nbsp;&nbsp; hacked=offset;<br>&nbsp;&nbsp;&nbsp; if (depth != 24) {&nbsp; /* typ. 1 or 8 bpp */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; data = (l_uint8 *)pixGetData(pix) + pixBpl * (height - 1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; height; i++) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (hacked+fileBpl&gt;size) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pixDestroy(&amp;pix);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("BMP read fail", procName, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//fread(data, 1, fileBpl, fp) != fileBpl<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(data,(char *)cdata+hacked,fileBpl);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hacked+=fileBpl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; data -= pixBpl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {&nbsp; /*&nbsp; 24 bpp file; 32 bpp pix<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; Note: for bmp files, pel&#091;0&#093; is blue, pel&#091;1&#093; is green,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; and pel&#091;2&#093; is red.&nbsp; This is opposite to the storage<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; in the pix, which puts the red pixel in the 0 byte,<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; the green in the 1 byte and the blue in the 2 byte.<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; Note also that all words are endian flipped after<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; assignment on L_LITTLE_ENDIAN platforms.<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; We can then make these assignments for little endians:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET_DATA_BYTE(pword, 1, pel&#091;0&#093;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blue<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET_DATA_BYTE(pword, 2, pel&#091;1&#093;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; green<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET_DATA_BYTE(pword, 3, pel&#091;2&#093;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; red<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; This looks like:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; (R)&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; (G)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; (B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------|------------|-----------|-----------|<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; and after byte flipping:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; (B)&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; (G)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; (R)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------|------------|-----------|-----------|<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; For big endians we set:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET_DATA_BYTE(pword, 2, pel&#091;0&#093;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blue<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET_DATA_BYTE(pword, 1, pel&#091;1&#093;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; green<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET_DATA_BYTE(pword, 0, pel&#091;2&#093;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; red<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; This looks like:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; (R)&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; (G)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; (B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------|------------|-----------|-----------|<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; so in both cases we get the correct assignment in the PIX.<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; Can we do a platform-independent assignment?<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; Yes, set the bytes without using macros:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((l_uint8 *)pword) = pel&#091;2&#093;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; red<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((l_uint8 *)pword + 1) = pel&#091;1&#093;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; green<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *((l_uint8 *)pword + 2) = pel&#091;0&#093;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blue<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp; For little endians, before flipping, this looks again like:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; (R)&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; (G)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; (B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |-----------|------------|-----------|-----------|<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; readerror = 0;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; extrabytes = fileBpl - 3 * width;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; line = pixGetData(pix) + pixWpl * (height - 1);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; height; i++) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (j = 0; j &lt; width; j++) <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pword = line + j;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*if (fread(&amp;pel, 1, 3, fp) != 3)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; readerror = 1;*/<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(hacked+3&gt;size)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; readerror=1;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(&amp;pel,(char *)cdata+hacked,3);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hacked+=3;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *((l_uint8 *)pword + COLOR_RED) = pel&#091;2&#093;;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *((l_uint8 *)pword + COLOR_GREEN) = pel&#091;1&#093;;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *((l_uint8 *)pword + COLOR_BLUE) = pel&#091;0&#093;;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; hacked+=extrabytes;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; line -= pixWpl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (readerror) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pixDestroy(&amp;pix);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (PIX *)ERROR_PTR("BMP read fail", procName, NULL);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; pixEndianByteSwap(pix);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /* ----------------------------------------------<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * The bmp colormap determines the values of black<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * and white pixels for binary in the following way:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * if black = 1 (255), white = 0<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255, 255, 255, 0, 0, 0, 0, 0<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * if black = 0, white = 1 (255)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, 0, 0, 0, 255, 255, 255, 0<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * We have no need for a 1 bpp pix with a colormap!<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * ---------------------------------------------- */<br>&nbsp;&nbsp;&nbsp; if (depth == 1 &amp;&amp; cmap) {<br>/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L_INFO("Removing colormap", procName); */<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pixt = pixRemoveColormap(pix, REMOVE_CMAP_BASED_ON_SRC);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pixDestroy(&amp;pix);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pix = pixt;&nbsp; /* rename */<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return pix;<br>}<br>// --------------------------------------------------------------------------------------------------------------------<br><br>TEST<br>//----------------------------------------------------------------------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; unsigned char* dstTmp = NULL;<br>&nbsp;&nbsp;&nbsp; FILE *file;<br>&nbsp;&nbsp;&nbsp; file =fopen("d:/testx.bmp","rb");<br>&nbsp;&nbsp;&nbsp; fseek (file , 0 , SEEK_END);<br>&nbsp;&nbsp;&nbsp; size_t length=ftell (file);<br>&nbsp;&nbsp;&nbsp; rewind (file);<br>&nbsp;&nbsp;&nbsp; dstTmp = (unsigned char*) malloc (sizeof(unsigned char)*length);<br>&nbsp;&nbsp;&nbsp; fread (dstTmp,1,length,file);<br>&nbsp;&nbsp;&nbsp; fclose(file);<br><br>&nbsp;&nbsp;&nbsp; Pix *pix = pixReadMem(dstTmp,length);<br>//----------------------------------------------------------------------------------------------------------------------<br><br><br>]]>
   </description>
   <pubDate>Sun, 09 Dec 2012 12:35:28 +0000</pubDate>
   <guid isPermaLink="true">http://forum.datakent.com/forum_posts.asp?TID=2465&amp;PID=5168#5168</guid>
  </item> 
 </channel>
</rss>