<?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 write to memory with PNG format</title>
  <link>http://forum.datakent.com/</link>
  <description>XML içerik linki; Datakent Forum : C, C++, Visual C++ : leptonica write to memory with PNG format</description>
  <pubDate>Fri, 01 May 2026 14:10:16 +0000</pubDate>
  <lastBuildDate>Sun, 09 Dec 2012 12:51:12 +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=2466</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 write to memory with PNG format : insert to leptonica -&amp;gt; pngi...</title>
   <link>http://forum.datakent.com/forum_posts.asp?TID=2466&amp;PID=5169#5169</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> 2466<br /><strong>Gönderim Zamanı:</strong> 09.Aralik.2012 Saat 12:51<br /><br />insert to leptonica -&gt; pngio.c<br>//-------------------------------------------------------------------------------<br>struct mem_encode<br>{<br>&nbsp; char *buffer;<br>&nbsp; size_t size;<br>};<br><br><br>void<br>my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)<br>{<br>&nbsp; /* with libpng15 next line causes pointer deference error; use libpng12 */<br>&nbsp; struct mem_encode* p=(struct mem_encode*)png_ptr-&gt;io_ptr;<br>&nbsp; size_t nsize = p-&gt;size + length;<br><br>&nbsp; /* allocate or grow buffer */<br>&nbsp; if(p-&gt;buffer)<br>&nbsp;&nbsp;&nbsp; p-&gt;buffer = (char *)realloc(p-&gt;buffer, nsize);<br>&nbsp; else<br>&nbsp;&nbsp;&nbsp; p-&gt;buffer = (char *)malloc(nsize);<br><br>&nbsp; if(!p-&gt;buffer)<br>&nbsp;&nbsp;&nbsp; png_error(png_ptr, "Write Error");<br><br>&nbsp; /* copy new bytes to end of buffer */<br>&nbsp; memcpy(p-&gt;buffer + p-&gt;size, data, length);<br>&nbsp; p-&gt;size += length;<br>}<br><br>void<br>my_png_flush(png_structp png_ptr)<br>{<br>}<br>//------------------------------------------------------------------------------------------<br><br>change "pixWriteMemPng"&nbsp; function in leptonica -&gt; pngio.c<br>//------------------------------------------------------------------------------------------<br>l_int32<br>pixWriteMemPng(l_uint8&nbsp; **pdata,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t&nbsp;&nbsp;&nbsp; *psize,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PIX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pix,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_float32&nbsp; gamma)<br>{<br>struct mem_encode state;<br>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commentstring&#091;&#093; = "Comment";<br>l_int32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i, j, k;<br>l_int32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wpl, d, cmflag;<br>l_int32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ncolors;<br>l_int32&nbsp;&nbsp;&nbsp;&nbsp; *rmap, *gmap, *bmap;<br>l_uint32&nbsp;&nbsp;&nbsp; *data, *ppixel;<br>png_byte&nbsp;&nbsp;&nbsp;&nbsp; bit_depth, color_type;<br>png_uint_32&nbsp; w, h;<br>png_uint_32&nbsp; xres, yres;<br>png_bytep&nbsp;&nbsp; *row_pointers;<br>png_bytep&nbsp;&nbsp;&nbsp; rowbuffer;<br>png_structp&nbsp; png_ptr;<br>png_infop&nbsp;&nbsp;&nbsp; info_ptr;<br>png_colorp&nbsp;&nbsp; palette;<br>PIX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pixt;<br>PIXCMAP&nbsp;&nbsp;&nbsp;&nbsp; *cmap;<br>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *text;<br><br>&nbsp;&nbsp;&nbsp; PROCNAME("pixWriteMemPng");<br>&nbsp;&nbsp;&nbsp; if (!pix)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("pix not defined", procName, 1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Allocate the 2 data structures */<br>&nbsp;&nbsp;&nbsp; if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (png_voidp)NULL, NULL, NULL)) == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("png_ptr not made", procName, 1);<br><br>&nbsp;&nbsp;&nbsp; if ((info_ptr = png_create_info_struct(png_ptr)) == NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_destroy_write_struct(&amp;png_ptr, (png_infopp)NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("info_ptr not made", procName, 1);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Set up png setjmp error handling */<br>&nbsp;&nbsp;&nbsp; if (setjmp(png_jmpbuf(png_ptr))) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_destroy_write_struct(&amp;png_ptr, &amp;info_ptr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("internal png error", procName, 1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; state.buffer = NULL;<br>&nbsp;&nbsp;&nbsp; state.size = 0;<br><br>&nbsp;&nbsp; png_set_write_fn(png_ptr, &amp;state, my_png_write_data, my_png_flush);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* With best zlib compression (9), get between 1 and 10% improvement<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * over default (5), but the compression is 3 to 10 times slower.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Our default compression is the zlib default (5). */<br>&nbsp;&nbsp;&nbsp; png_set_compression_level(png_ptr, var_ZLIB_COMPRESSION);<br><br>&nbsp;&nbsp;&nbsp; w = pixGetWidth(pix);<br>&nbsp;&nbsp;&nbsp; h = pixGetHeight(pix);<br>&nbsp;&nbsp;&nbsp; d = pixGetDepth(pix);<br>&nbsp;&nbsp;&nbsp; if ((cmap = pixGetColormap(pix)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmflag = 1;<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmflag = 0;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Set the color type and bit depth. */<br>&nbsp;&nbsp;&nbsp; if (d == 32 &amp;&amp; var_PNG_WRITE_ALPHA == 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit_depth = 8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color_type = PNG_COLOR_TYPE_RGBA;&nbsp;&nbsp; /* 6 */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmflag = 0;&nbsp; /* ignore if it exists */<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (d == 24 || d == 32) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit_depth = 8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color_type = PNG_COLOR_TYPE_RGB;&nbsp;&nbsp; /* 2 */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmflag = 0;&nbsp; /* ignore if it exists */<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit_depth = d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color_type = PNG_COLOR_TYPE_GRAY;&nbsp; /* 0 */<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if (cmflag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color_type = PNG_COLOR_TYPE_PALETTE;&nbsp; /* 3 */<br><br>#if&nbsp; DEBUG<br>&nbsp;&nbsp;&nbsp; fprintf(stderr, "cmflag = %d, bit_depth = %d, color_type = %d\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmflag, bit_depth, color_type);<br>#endif&nbsp; /* DEBUG */<br><br>&nbsp;&nbsp;&nbsp; png_set_IHDR(png_ptr, info_ptr, w, h, bit_depth, color_type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PNG_FILTER_TYPE_BASE);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Store resolution in ppm, if known */<br>&nbsp;&nbsp;&nbsp; xres = (png_uint_32)(39.37 * (l_float32)pixGetXRes(pix) + 0.5);<br>&nbsp;&nbsp;&nbsp; yres = (png_uint_32)(39.37 * (l_float32)pixGetYRes(pix) + 0.5);<br>&nbsp;&nbsp;&nbsp; if ((xres == 0) || (yres == 0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_set_pHYs(png_ptr, info_ptr, 0, 0, PNG_RESOLUTION_UNKNOWN);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_set_pHYs(png_ptr, info_ptr, xres, yres, PNG_RESOLUTION_METER);<br><br>&nbsp;&nbsp;&nbsp; if (cmflag) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixcmapToArrays(cmap, &amp;rmap, &amp;gmap, &amp;bmap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ncolors = pixcmapGetCount(cmap);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Make and save the palette */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((palette = (png_colorp)(CALLOC(ncolors, sizeof(png_color))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("palette not made", procName, 1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; ncolors; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; palette<em>.red = (png_byte)rmap<em>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; palette<em>.green = (png_byte)gmap<em>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; palette<em>.blue = (png_byte)bmap<em>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_set_PLTE(png_ptr, info_ptr, palette, (int)ncolors);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(rmap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(gmap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(bmap);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 0.4545 is treated as the default by some image<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * display programs (not gqview).&nbsp; A value &gt; 0.4545 will<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * lighten an image as displayed by xv, display, etc. */<br>&nbsp;&nbsp;&nbsp; if (gamma &gt; 0.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_set_gAMA(png_ptr, info_ptr, (l_float64)gamma);<br><br>&nbsp;&nbsp;&nbsp; if ((text = pixGetText(pix))) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_text text_chunk;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.compression = PNG_TEXT_COMPRESSION_NONE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.key = commentstring;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.text = text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.text_length = strlen(text);<br>#ifdef PNG_ITXT_SUPPORTED<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.itxt_length = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.lang = NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text_chunk.lang_key = NULL;<br>#endif<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_set_text(png_ptr, info_ptr, &amp;text_chunk, 1);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Write header and palette info */<br>&nbsp;&nbsp;&nbsp; png_write_info(png_ptr, info_ptr);<br><br>&nbsp;&nbsp;&nbsp; if ((d != 32) &amp;&amp; (d != 24)) <br>&nbsp;&nbsp;&nbsp; {&nbsp; /* not rgb color */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Generate a temporary pix with bytes swapped.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * For a binary image, there are two conditions in<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * which you must first invert the data for writing png:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; (a) no colormap<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; (b) colormap with BLACK set to 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * png writes binary with BLACK = 0, unless contradicted<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * by a colormap.&nbsp; If the colormap has BLACK = "1"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * (typ. about 255), do not invert the data.&nbsp; If there<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * is no colormap, you must invert the data to store<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * in default BLACK = 0 state.&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (d == 1 &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!cmap || (cmap &amp;&amp; ((l_uint8 *)(cmap-&gt;array))&#091;0&#093; == 0x0))) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixt = pixInvert(NULL, pix);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixEndianByteSwap(pixt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixt = pixEndianByteSwapNew(pix);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!pixt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_destroy_write_struct(&amp;png_ptr, &amp;info_ptr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("pixt not made", procName, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Make and assign array of image row pointers */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((row_pointers = (png_bytep *)CALLOC(h, sizeof(png_bytep))) == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("row-pointers not made", procName, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wpl = pixGetWpl(pixt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = pixGetData(pixt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; h; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row_pointers<em> = (png_bytep)(data + i * wpl);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_set_rows(png_ptr, info_ptr, row_pointers);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Transfer the data */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_write_image(png_ptr, row_pointers);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_write_end(png_ptr, info_ptr);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cmflag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(palette);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(row_pointers);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixDestroy(&amp;pixt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_destroy_write_struct(&amp;png_ptr, &amp;info_ptr);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *pdata=(unsigned char *)state.buffer;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *psize=state.size;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* For rgb, compose and write a row at a time */<br>&nbsp;&nbsp;&nbsp; data = pixGetData(pix);<br>&nbsp;&nbsp;&nbsp; wpl = pixGetWpl(pix);<br>&nbsp;&nbsp;&nbsp; if (d == 24) {&nbsp; /* See note 7 above: special case of 24 bpp rgb */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; h; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ppixel = data + i * wpl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_write_rows(png_ptr, (png_bytepp)&amp;ppixel, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {&nbsp; /* 32 bpp rgb and rgba */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((rowbuffer = (png_bytep)CALLOC(w, 4)) == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ERROR_INT("rowbuffer not made", procName, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; h; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ppixel = data + i * wpl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = k = 0; j &lt; w; j++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rowbuffer&#091;k++&#093; = GET_DATA_BYTE(ppixel, COLOR_RED);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rowbuffer&#091;k++&#093; = GET_DATA_BYTE(ppixel, COLOR_GREEN);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rowbuffer&#091;k++&#093; = GET_DATA_BYTE(ppixel, COLOR_BLUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (var_PNG_WRITE_ALPHA == 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rowbuffer&#091;k++&#093; = GET_DATA_BYTE(ppixel, L_ALPHA_CHANNEL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ppixel++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; png_write_rows(png_ptr, &amp;rowbuffer, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(rowbuffer);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; png_write_end(png_ptr, info_ptr);<br><br>&nbsp;&nbsp;&nbsp; if (cmflag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FREE(palette);<br>&nbsp;&nbsp;&nbsp; png_destroy_write_struct(&amp;png_ptr, &amp;info_ptr);<br>&nbsp;&nbsp;&nbsp; *pdata=(unsigned char *)state.buffer;<br>&nbsp;&nbsp;&nbsp; *psize=state.size;<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>TEST<br>//----------------------------------------------------------------------------------------------------<br><br>&nbsp;&nbsp;&nbsp; unsigned char* dstTmp = NULL;<br>&nbsp;&nbsp;&nbsp; FILE *file;<br>&nbsp;&nbsp;&nbsp; file =fopen("d:/b.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>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; pixWriteMemPng(&amp;dstTmp,&amp;length,pix,0);<br><br>&nbsp; &nbsp; file=fopen("d:/test.png","wb");<br>&nbsp;&nbsp;&nbsp; fwrite(dstTmp,1,length,file);<br>&nbsp;&nbsp;&nbsp; fclose(file);<br>//----------------------------------------------------------------------------------------------------<br>]]>
   </description>
   <pubDate>Sun, 09 Dec 2012 12:51:12 +0000</pubDate>
   <guid isPermaLink="true">http://forum.datakent.com/forum_posts.asp?TID=2466&amp;PID=5169#5169</guid>
  </item> 
 </channel>
</rss>