當前位置:編程學習大全網 - 源碼下載 - 如何用C++在屏幕上顯示png圖片?

如何用C++在屏幕上顯示png圖片?

如何在Windows應用程序中顯示jpeg和png格式的圖片 源代碼片段(zip壓縮包,5k) 依賴的第三方庫(zip壓縮包,900k) 經常看到有人在bbs技術版面上問類似的問題,簡要介紹壹下怎麽解決這個小問題。因為Win32 API只對bmp格式的位圖提供基本支持,所以需要使用第三方庫來完成這個任務。GDI+其實就是壹個很好的選擇,不僅支持多種圖片格式,而且支持圖像處理操作,並且做了壹定的優化,接口定義也十分清晰。 這裏講的是基於Independent Jpeg Group的JpegLib和libpng.org的libpng兩個庫的解決方案。Jpeg和png兩種格式都是帶壓縮的圖像格式,,所不同的是jpeg使用了有損壓縮,png使用了無損壓縮。要在Windows程序中顯示這兩種圖片需要將壓縮過的圖片在內存中還原為位圖。相對而言bmp格式的圖片處理起來就容易得多,以至於查查資料每個人都可以寫壹個讀取bmp圖片的模塊,當然,也不完全那麽容易,還要考慮多種顏色模式和bmp圖片中4像素對齊的問題。OK,不管jpeg和png讀取多麽麻煩,ijg和libpng.org已經寫好了讀取這兩種格式文件的庫,這兩個庫都是用C語言寫的,期中libpng依賴於zlib,而zlib也是用C寫成。 最近做的項目需要使用jpeg和png圖片,這裏把壹些代碼片段(沒有DEMO,單讀取文件部分是完整的)分享壹下,這些代碼的原始版本並不是我們小組寫的,但是我們進行了封裝並且修復了壹些bug(比如內存泄露)。本來是想做個小DEMO演示壹下,但是工作量比較大(我試圖同時支持vc6,vc71,vc80,dev-cpp等等)。 以下是載入jpeg圖片的方法: C++代碼 HBITMAP PictureLoader::LoadJpegPicture( const char* fileName ) { FILE * jpegFile; struct jpeg_error_mgr jerr; struct jpeg_decompress_struct cinfo; if ((jpegFile = fopen(fileName, "rb")) == NULL) { return HBITMAP(0); } cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, jpegFile); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); int rowSize = cinfo.output_width * cinfo.output_components; int width=cinfo.output_width; int height=cinfo.output_height; BYTE *bmpBuffer=new BYTE[(height+1)*width*3]; BYTE **pBuffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, rowSize, 1); while(cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, pBuffer, 1); int start=rowSize*(cinfo.output_scanline-1); for(int i = 0; i < rowSize; i++) { bmpBuffer[start+i]=pBuffer[0][i]; } } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); HBITMAP bitmap = CreateBitmapFromBuffer(bmpBuffer, width, height); fclose(jpegFile); delete[] bmpBuffer; return bitmap; }

  • 上一篇:C#,目前最好的字符串加密解密算法是什麽?
  • 下一篇:關於計算機源代碼著作權的法律法規有哪些可以告訴我嗎
  • copyright 2024編程學習大全網