// 생성자(Size) CDIB::CDIB(int w, int h) : DIB(NULL), Alpha(NULL), Rgn(NULL), W(w), H(h) { Construct(); InitDIB(); InitRgnSimple(); }
void CDIB::LoadJPEGFile(wstring file_name) { // 에러 핸들러 설정 jpeg_decompress_struct jd; jpeg_error_mgr jem; jd.err=jpeg_std_error(&jem); jem.error_exit=JpegErrorHandler; // 파일 열기 FILE* fp=_wfopen(file_name.c_str(), L"rb"); if (!fp) return; // 디코드 전처리 jpeg_create_decompress(&jd); jpeg_stdio_src(&jd, fp); jpeg_read_header(&jd, TRUE); jpeg_start_decompress(&jd); // DIB 초기화 W=jd.image_width; H=jd.image_height; InitDIB(); // 디코드 for (int row=0; row<H; row++) { JSAMPROW jsr=(JSAMPROW)(Pixel+row*W); jpeg_read_scanlines(&jd, &jsr, 1); // 24bit에서 32bit로 변환한다(libjpeg에서 수행하는 방법도 있음) char *p=(char*)(Pixel+row*W)+3*(W-1), *q=(char*)(Pixel+row*W)+4*(W-1); do { q[0]=p[0]; q[1]=p[1]; q[2]=p[2]; q[3]=0; p-=3; q-=4; } while (p!=q); } // 디코드 후처리 jpeg_finish_decompress(&jd); jpeg_destroy_decompress(&jd); // Alpha 초기화 BYTE* a=Alpha; for (int y=0; y<H; y++) { for (int x=0; x<W; x++, a++) *a=1; } // Region 초기화 InitRgn(); }
//============================================================== // 화면 캡쳐 void CDIB::Capture(HWND hwnd) { // 화상 크기를 윈도우 크기에 맞춘다 if (!hwnd) hwnd=GetDesktopWindow(); GetWindowWH(hwnd, &W, &H); InitDIB(); InitRgnSimple(); // 화면을 캡쳐한다 HDC hdc_win=::GetDC(NULL); BitBlt(DC, 0, 0, W, H, hdc_win, 0, 0, SRCCOPY); ReleaseDC(NULL, hdc_win); }
// BMP 형식의 로드 void CDIB::LoadBMPFile(wstring file_name) { // BITMAP 로드 HBITMAP hbmp=(HBITMAP)LoadImage( NULL, file_name.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // DIB 초기화 BITMAP bmp; GetObject(hbmp, sizeof(bmp), &bmp); W=bmp.bmWidth; H=bmp.bmHeight; InitDIB(); FillMemory(Alpha, W*H, 255); InitRgnSimple(); // BITMAP을 DBI에 복사 Draw(0, 0, W, H, hbmp, 0, 0, W, H); DeleteObject(hbmp); }
// PNG 형식의 로드 void CDIB::LoadPNGFile(wstring file_name) { unsigned int sig_read=0; int bit_depth, color_type, interlace_type; // 파일 열기 FILE* fp=_wfopen(file_name.c_str(), L"rb"); if (!fp) return; // png_struct 초기화 png_structp png_ptr=png_create_read_struct( PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fclose(fp); return; } png_init_io(png_ptr, fp); // png_info 초기화 png_infop info_ptr=png_create_info_struct(png_ptr); if (!info_ptr) { fclose(fp); png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); return; } // 화상정보 취득 png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, (unsigned long*)&W, (unsigned long*)&H, &bit_depth, &color_type, &interlace_type, NULL, NULL); // DIB 초기화 InitDIB(); // 변환방법 설정 // Palette를 RGB로 if (color_type==PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); // 투명색을 Alpha로 if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); // Bit depth를 8bit로 if (bit_depth<8) png_set_packing(png_ptr); else if (bit_depth==16) png_set_strip_16(png_ptr); // 24bit(RGB)를 32bit(RGB0)로 if (color_type==PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); // RGB를 BGR로 if (color_type==PNG_COLOR_TYPE_PALETTE || color_type==PNG_COLOR_TYPE_RGB || color_type==PNG_COLOR_TYPE_RGB_ALPHA) png_set_bgr(png_ptr); // 화상 읽기 png_bytep *row_pointers=new png_bytep[H]; for (int row=0; row<H; row++) row_pointers[row]=(png_bytep)(Pixel+row*W); png_read_image(png_ptr, row_pointers); png_read_end(png_ptr, info_ptr); delete [] row_pointers; // 뒷처리 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); // Alpha 값을 얻는다 DWORD* p=Pixel; BYTE* a=Alpha; for (int y=0; y<H; y++) { for (int x=0; x<W; x++, p++, a++) { *a=(BYTE)(*p>>24); *p&=0x00ffffff; } } // Region 초기화 InitRgn(); }
HBITMAP CBildObjekt::ReadFile (const char *pcFileName) { return InitDIB (pcFileName) ? m_hDDB : NULL; // Bild einlesen }