p2png.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:5k
源码类别:

打印编程

开发平台:

Visual C++

  1. #include "p2png.h"
  2. #include <string>
  3. int  interlace = 0;
  4. png_color_16 color_values;
  5. static BOOL read_bmp(char *, IMAGE *);
  6. static const char *read_rgb_bits(IMAGE *, FILE *);
  7. static unsigned long mgetdwl(void *);
  8. static unsigned int mgetwl(void *);
  9. static BOOL write_png(char *, IMAGE *);
  10. void start_toPNG(char *NameBmp, char *NamePng)
  11.     std::string  namepng; 
  12. namepng=NameBmp;
  13. namepng +=".png";
  14.     IMAGE image;
  15.     read_bmp(NameBmp, &image);
  16.     write_png((char *)namepng.c_str(), &image);
  17. }     
  18. static BOOL read_bmp(char *fn, IMAGE *img)
  19. {
  20. BYTE bfh[138];
  21. BYTE *const bih = bfh + 14;
  22. BYTE rgbq[4];
  23. DWORD offbits, bihsize, skip;
  24. UINT palette_size, true_pixdepth;
  25. PALETTE *pal;
  26. FILE *fp;
  27. int i;
  28. imgbuf_init(img);
  29. if (fn == NULL)    goto error_abort; else  fp = fopen(fn, "rb");
  30.     fread(bfh,18,1, fp);
  31. offbits = mgetdwl(bfh + 10);
  32. bihsize = mgetdwl(bfh + 14);
  33. skip    = offbits - bihsize - 14;
  34. // if (bihsize < 12 || bihsize > 124 ||
  35. //     offbits < (bihsize + 14)) goto error_abort;
  36. if (fread((bih + 4), (bihsize - 4), 1, fp) != 1)
  37. goto error_abort;
  38. img->width    = mgetdwl(bih + 4);
  39. img->height   = mgetdwl(bih + 8);
  40. img->pixdepth = mgetwl(bih + 14);
  41. img->topdown  = FALSE;
  42.      img->alpha    = FALSE;
  43. img->palnum = 0;
  44. if (!imgbuf_alloc(img)) goto error_abort;
  45. for (pal = img->palette, i = img->palnum; i > 0; pal++, i--) {
  46. if (fread(rgbq, 4, 1, fp) != 1)
  47. goto error_abort;
  48. pal->red   = rgbq[2];
  49. pal->green = rgbq[1];
  50. pal->blue  = rgbq[0];
  51. }
  52. for ( ; skip > 0; skip--) {
  53. if (fgetc(fp) == EOF)
  54. goto error_abort;
  55. }
  56. img->sigbit.red  = img->sigbit.green = img->sigbit.blue = 8;
  57. img->sigbit.gray = img->sigbit.alpha = 8;
  58. read_rgb_bits(img, fp);
  59. if (fp != stdin) fclose(fp);
  60. return TRUE;
  61. error_abort: /* error */
  62. if (fp != stdin && fp != NULL) fclose(fp);
  63. imgbuf_free(img);
  64. return FALSE;
  65. }
  66. static const char *read_rgb_bits(IMAGE *img, FILE *fp)
  67. {
  68. DWORD rd  = 16*1024*1024;
  69. DWORD num = img->imgbytes;
  70. BYTE *ptr = img->bmpbits;
  71. while (num > 0) {
  72. if (rd > num) rd = num;
  73. if (fread(ptr, rd, 1, fp) != 1)
  74. return "ERROR";
  75. ptr += rd; num -= rd;
  76. }
  77. return NULL;
  78. }
  79. static unsigned long mgetdwl(void *ptr)
  80. {
  81.     unsigned char *p = (unsigned char *)ptr;
  82. return ((unsigned long)p[0]      ) + ((unsigned long)p[1] <<  8) +
  83.        ((unsigned long)p[2] << 16) + ((unsigned long)p[3] << 24);
  84. }
  85. static unsigned int mgetwl(void *ptr)
  86. {
  87. unsigned char *p = (unsigned char *)ptr;
  88. return ((unsigned int)p[0]) + ((unsigned int)p[1] << 8);
  89. }
  90. static BOOL write_png(char *fn, IMAGE *img)
  91. {
  92. png_structp png_ptr;
  93. png_infop info_ptr;
  94. int bit_depth;
  95. int color_type;
  96. int interlace_type;
  97. png_byte trans[256];
  98. unsigned i;
  99. FILE *fp;
  100. if (fn == NULL)  goto error_abort; else fp = fopen(fn, "wb");
  101. png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, fn,
  102.                                     png_my_error, png_my_warning);
  103. info_ptr = png_create_info_struct(png_ptr);
  104. png_init_io(png_ptr, fp);
  105. png_set_compression_level(png_ptr, 9);
  106. bit_depth  = 8;
  107. color_type = (img->pixdepth == 32 && img->alpha) ?
  108.                 PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB;
  109. png_set_compression_mem_level(png_ptr, MAX_MEM_LEVEL);
  110. interlace_type = 0 ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE;
  111. png_set_IHDR(png_ptr, info_ptr, img->width, img->height, bit_depth,
  112.              color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT,
  113.              PNG_FILTER_TYPE_DEFAULT);
  114. for (i = 0; i < img->palnum; i++) {
  115. if (img->palette[i].red   == color_values.red   &&
  116.     img->palette[i].green == color_values.green &&
  117.     img->palette[i].blue  == color_values.blue) {
  118. trans[i++] = 0x00;
  119. break;
  120. }
  121. trans[i] = 0xFF;
  122. }
  123. png_write_info(png_ptr, info_ptr);
  124. png_set_bgr(png_ptr);
  125. png_write_image(png_ptr, img->rowptr);
  126. png_write_end(png_ptr, info_ptr);
  127. png_destroy_write_struct(&png_ptr, &info_ptr);
  128.     fflush(fp);
  129. if (fp != stdout) fclose(fp);
  130. imgbuf_free(img);
  131. return TRUE;
  132.     error_abort:
  133. if (fp != stdout && fp != NULL) fclose(fp);
  134. imgbuf_free(img);
  135. return FALSE;
  136. }
  137. void png_my_error(png_structp png_ptr, png_const_charp message)
  138. {
  139. longjmp(png_jmpbuf(png_ptr), 1);
  140. }
  141. void png_my_warning(png_structp png_ptr, png_const_charp message){}
  142. BOOL imgbuf_alloc(IMAGE *img)
  143. {
  144. BYTE *bp, **rp;
  145. LONG n;
  146. if (img->palnum > 0) {
  147. img->palette =(PALETTE *) malloc((size_t)img->palnum * sizeof(PALETTE));
  148. if (img->palette == NULL) { imgbuf_init(img); return FALSE; }
  149. } else {
  150. img->palette = NULL;
  151. }
  152. img->rowbytes = ((DWORD)img->width * img->pixdepth + 31) / 32 * 4;
  153. img->imgbytes = img->rowbytes * img->height;
  154. img->rowptr   =(BYTE **)malloc((size_t)img->height * sizeof(BYTE *));
  155. img->bmpbits  =(BYTE *)malloc((size_t)img->imgbytes);
  156. if (img->rowptr == NULL || img->bmpbits == NULL) {
  157. imgbuf_free(img); imgbuf_init(img); return FALSE;
  158. }
  159. n  = img->height;
  160. rp = img->rowptr;
  161. bp = img->bmpbits;
  162. if (img->topdown) {
  163. while (--n >= 0) {
  164. *(rp++) = bp;
  165. bp += img->rowbytes;
  166. }
  167. } else {
  168. bp += img->imgbytes;
  169. while (--n >= 0) {
  170. ((DWORD *)bp)[-1] = 0;
  171. bp -= img->rowbytes;
  172. *(rp++) = bp;
  173. }
  174. }
  175. return TRUE;
  176. }
  177. void imgbuf_free(IMAGE *img)
  178. {
  179. free(img->palette);
  180. free(img->rowptr);
  181. free(img->bmpbits);
  182. }
  183. void imgbuf_init(IMAGE *img)
  184. {
  185. img->palette = NULL;
  186. img->rowptr  = NULL;
  187. img->bmpbits = NULL;
  188. }