dibijg.cpp
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:5k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. // demjpg.cpp
  2. //
  3. #include "stdafx.h"
  4. extern "C" {
  5. #include <jpeglib.h>
  6. }
  7. #include <dibsect.h>
  8. #include <setjmp.h>
  9. //extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */
  10. //extern int image_height; /* Number of rows in image */
  11. //extern int image_width; /* Number of columns in image */
  12. struct my_error_mgr {
  13.   struct jpeg_error_mgr pub; /* "public" fields */
  14.   jmp_buf setjmp_buffer; /* for return to caller */
  15. };
  16. typedef struct my_error_mgr * my_error_ptr;
  17. /*
  18.  * Here's the routine that will replace the standard error_exit method:
  19.  */
  20. METHODDEF(void)
  21. my_error_exit (j_common_ptr cinfo)
  22. {
  23.   /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
  24.   my_error_ptr myerr = (my_error_ptr) cinfo->err;
  25.   /* Always display the message. */
  26.   /* We could postpone this until after returning, if we chose. */
  27.   (*cinfo->err->output_message) (cinfo);
  28.   /* Return control to the setjmp point */
  29.   longjmp(myerr->setjmp_buffer, 1);
  30. }
  31. #define SWAP(a, b) { 
  32.     (a) ^= (b); 
  33.     (b) ^= (a); 
  34.     (a) ^= (b); 
  35. }
  36. int OpenIJG2DIB(const char * filename, DIBSection& dib)
  37. {
  38. int result = 0;
  39. struct jpeg_decompress_struct cinfo;
  40. struct my_error_mgr jerr;
  41. FILE * infile; /* source file */
  42. JSAMPARRAY buffer; /* Output row buffer */
  43. int row_stride; /* physical row width in output buffer */
  44. if ((infile = fopen(filename, "rb")) == NULL)
  45. {
  46. //fprintf(stderr, "can't open %sn", filename);
  47. return result;
  48. }
  49. cinfo.err = jpeg_std_error(&jerr.pub);
  50. jerr.pub.error_exit = my_error_exit;
  51. if (setjmp(jerr.setjmp_buffer))
  52. {
  53. jpeg_destroy_decompress(&cinfo);
  54. fclose(infile);
  55. return result;
  56. }
  57. jpeg_create_decompress(&cinfo);
  58. jpeg_stdio_src(&cinfo, infile);
  59. jpeg_read_header(&cinfo, TRUE);
  60. jpeg_start_decompress(&cinfo);
  61. if (cinfo.num_components == 3)
  62. {
  63. dib.Create(cinfo.image_width, cinfo.image_height, 24);
  64. if (dib.IsCreated())
  65. {
  66. row_stride = cinfo.output_width * cinfo.output_components;
  67. buffer = (*cinfo.mem->alloc_sarray)
  68. ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
  69. unsigned char * dibBits = (unsigned char *)dib.GetBits();
  70. UINT32 off;
  71. UINT32 tw = dib.GetTotalWidth();
  72. UINT32 height = dib.Height();
  73. UINT32 imgWidth = dib.Width() * 3;
  74. UINT32 col;
  75. UINT32 row = 0;
  76. while (cinfo.output_scanline < cinfo.output_height){
  77. // pull the scanline out of the file and into
  78. // buffer
  79. jpeg_read_scanlines(&cinfo, buffer, 1);
  80. // swap all the red and blue pixels
  81. for (col=0;col<imgWidth;col+=3){
  82. SWAP(buffer[0][col],buffer[0][col+2]);
  83. }
  84. // copy the row over to the appropriate place in the
  85. // output dib
  86. off = (height - ++row) * 3 * tw;
  87. memcpy(&dibBits[off],buffer[0],row_stride);
  88. }
  89. }
  90. result++;
  91. }
  92. jpeg_finish_decompress(&cinfo);
  93. jpeg_destroy_decompress(&cinfo);
  94. fclose(infile);
  95. return result;
  96. }
  97. int SaveDIB2IJG(const char * filename, DIBSection& dib, INT32 quality)
  98. {
  99. int result = 0;
  100. if (dib.IsCreated() && (dib.GetBitCount() == 24))
  101. {
  102. struct jpeg_compress_struct cinfo;
  103. struct jpeg_error_mgr jerr;
  104. FILE * outfile;
  105. JSAMPROW row_pointer[1];
  106. int row_stride;
  107. memset(&cinfo,0,sizeof(jpeg_compress_struct));
  108. cinfo.err = jpeg_std_error(&jerr);
  109. jpeg_create_compress(&cinfo);
  110. if ((outfile = fopen(filename, "wb")) == NULL)
  111. {
  112. fprintf(stderr, "can't open %sn", filename);
  113. exit(1);
  114. }
  115. jpeg_stdio_dest(&cinfo, outfile);
  116. cinfo.image_width = dib.Width();
  117. cinfo.image_height = dib.Height();
  118. cinfo.input_components = 3;
  119. cinfo.in_color_space = JCS_RGB;
  120. jpeg_set_defaults(&cinfo);
  121. jpeg_set_quality(&cinfo, quality, TRUE);
  122. jpeg_start_compress(&cinfo, TRUE);
  123. row_stride = cinfo.image_width * 3;
  124. unsigned char * dibBits = (unsigned char *)dib.GetBits();
  125. UINT32 off;
  126. UINT32 tw = dib.GetTotalWidth();
  127. UINT32 height = dib.Height();
  128. UINT32 imgWidth = dib.Width() * 3;
  129. UINT32 col;
  130. UINT32 row = 0;
  131. while (cinfo.next_scanline < cinfo.image_height){
  132.   // copy the row over to the appropriate place in the
  133.   // output dib
  134. off = (height - ++row) * 3 * tw;
  135. row_pointer[0] = &dibBits[off];
  136. // swap all the red and blue pixels
  137. for (col=0;col<imgWidth;col+=3){
  138. SWAP(row_pointer[0][col],row_pointer[0][col+2]);
  139. }
  140. jpeg_write_scanlines(&cinfo, row_pointer, 1);
  141. }
  142. jpeg_finish_compress(&cinfo);
  143. fclose(outfile);
  144. jpeg_destroy_compress(&cinfo);
  145. }
  146. return result;
  147. }