//プロジェクト名overlayjpeg001 C++ソースファイルoverlayjpeg001.cpp #include #include #include #include #pragma comment(lib, "libjpeg.lib") static char documentation[] = "this software is based in part on the work of the Independent JPEG Group"; extern "C" { __declspec(dllexport) void overlayjpeg( HDC hdc, int by1, int bx1, int by2, int bx2, char * string01); struct my_error_mgr { struct jpeg_error_mgr pub; jmp_buf setjmp_buffer; }; typedef struct my_error_mgr * my_error_ptr; METHODDEF(void) my_error_exit (j_common_ptr cinfo) { my_error_ptr myerr = (my_error_ptr) cinfo->err; (*cinfo->err->output_message) (cinfo); longjmp(myerr->setjmp_buffer, 1); } void overlayjpeg( HDC hdc, int by1, int bx1, int by2, int bx2, char * string01) { if (strstr( string01, ".jpg") == 0) if (strstr( string01, ".JPG") == 0) if (strstr( string01, ".jpeg") == 0) if (strstr( string01, ".JPEG") == 0) return; FILE * fp01 = NULL; if((fp01=fopen(string01,"rb"))==NULL) { return; } SetGraphicsMode( hdc,GM_ADVANCED); SetBkMode( hdc,TRANSPARENT); SetStretchBltMode( hdc, COLORONCOLOR); int dpix=GetDeviceCaps( hdc,LOGPIXELSX); int dpiy=GetDeviceCaps( hdc,LOGPIXELSY); struct jpeg_decompress_struct cinfo; // struct jpeg_error_mgr jerr; struct my_error_mgr jerr; JSAMPARRAY buffer; int row_stride; int image_width; int image_height; char * dib = NULL; unsigned char * bmp_image; int bmp_row; int bmp_row_bytes; int bmp_image_size; // cinfo.err = jpeg_std_error(&jerr); cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); if (fp01 != NULL) fclose(fp01); if (dib != NULL) free(dib); return; } jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, fp01); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); if( !buffer) { jpeg_destroy_decompress(&cinfo); if (fp01 != NULL) fclose(fp01); if (dib != NULL) free(dib); return; } image_width = cinfo.image_width; image_height = cinfo.image_height; bmp_row_bytes = (( ( image_width * 3 ) + 3 ) / 4) * 4; bmp_image_size = bmp_row_bytes * image_height; dib = (char *)malloc( 40 + bmp_image_size ); if( !dib) { jpeg_destroy_decompress(&cinfo); if (fp01 != NULL) fclose(fp01); if (dib != NULL) free(dib); return; } bmp_image = (unsigned char *)(dib + 40); bmp_row = image_height - 1; while (cinfo.output_scanline < cinfo.output_height) { int i; unsigned char * src, * dest; (void) jpeg_read_scanlines(&cinfo, buffer, 1); src = buffer[0]; dest = &bmp_image[ bmp_row_bytes * bmp_row-- ]; for( i = 0; i < row_stride; i+=3 ) { * dest++ = src[i+2]; * dest++ = src[i+1]; * dest++ = src[i]; } for( i = 0; i < bmp_row_bytes - image_width * 3; i++ ) * dest++ = 0; } (void) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(fp01); memset( dib, 0, 40 ); * (long *)(dib+0) = 40; * (long *)(dib+4) = image_width; * (long *)(dib+8) = image_height; * (short *)(dib+12) = 1; * (short *)(dib+14) = 24; * (long *)(dib+20) = bmp_image_size; BITMAPINFO * info = (BITMAPINFO *)dib; BYTE * bitmap = bmp_image; StretchDIBits( hdc, (int)((dpix * bx1)/254), (int)((dpix * by1)/254), (int)((dpix * (bx2-bx1))/254), (int)((dpix * (by2-by1))/254), 0, 0, info->bmiHeader.biWidth, info->bmiHeader.biHeight, bitmap, info, DIB_RGB_COLORS, SRCCOPY); free(dib); return; } }