CxImage的使用
1、首先從此處下載源代碼
http://www.codeproject.com/KB/graphics/cximage.aspx
2、然后將里面的工程全部編譯一下,我覺得應該是生成對應的庫。
3、然后用vc建個工程,同時將源代碼里面除了Demo這些文件夾,全部考到新建工程的同一目錄。
4、接下來就是最麻煩的配置了:
|- C/C++
| |- Code Generation
| | |- Use run-time library : Multithreaded DLL (must be the same for
| | | all the linked libraries) //應該只要是多線程DLL即可,DEBUG的也行
| | |- Struct member alignment : must be the same for all the linked libraries
| |- Precompiled headers : not using precompiled headers)
配置lib庫:
Project->Setting->link選項卡:
在“對象/庫模塊”下添加
../png/Debug/png.lib ../jpeg/Debug/jpeg.lib ../zlib/Debug/zlib.lib ../tiff/Debug/tiff.lib ../jbig/Debug/jbig.lib ../jasper/Debug/jasper.lib ../cximage/Debug/cximage.lib。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/skyair624/archive/2008/10/01/3008014.aspx
在c/c++的附加包含路徑里面填上:../CxImage(我也不知道這是干什么的)
5、添加頭文件
#include "../CxImage/ximage.h"
#include "../CxImage/ximacfg.h"
6、關鍵代碼:
CxImage image;
image.Load(_T("abc.bmp"), CXIMAGE_FORMAT_BMP);
if (image.IsValid()){
cout << "ok" << endl;
image.Save(_T("image.jpg"), CXIMAGE_FORMAT_JPG);// 把壓縮后的圖像以jpg文件類型保存起來。
}
首先在工程目錄下你得放一個abc.bmp的圖片,可以用下面這個代碼產生:
void CapScreen(char filename[])
{
CDC *pDC;
pDC = CDC::FromHandle(GetDC(GetDesktopWindow()));
if(pDC == NULL) return;
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);
CDC memDC;
if(memDC.CreateCompatibleDC(pDC) == 0) return;
CBitmap memBitmap, *oldmemBitmap;
if(memBitmap.CreateCompatibleBitmap(pDC, Width, Height) == NULL) return;
oldmemBitmap = memDC.SelectObject(&memBitmap);
if(oldmemBitmap == NULL) return;
if(memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY) == 0) return;
BITMAP bmp;
memBitmap.GetBitmap(&bmp);
FILE *fp = fopen(filename, "w+b");
BITMAPINFOHEADER bih = {0};
bih.biBitCount = bmp.bmBitsPixel;
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;
bih.biWidth = bmp.bmWidth;
BITMAPFILEHEADER bfh = {0};
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;
bfh.bfType = (WORD)0x4d42;
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);
fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);
BYTE * p = new BYTE[bmp.bmWidthBytes * bmp.bmHeight];
GetDIBits(memDC.m_hDC,
(HBITMAP) memBitmap.m_hObject,
0,
Height,
p,
(LPBITMAPINFO) &bih,
DIB_RGB_COLORS);
fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);
delete [] p;
fclose(fp);
memDC.SelectObject(oldmemBitmap);
}
7、最后運行就可以了
我的可以將5M的bmp文件壓縮成168K的jpeg
8、note:
image.Load(_T("image.bmp"), CXIMAGE_FORMAT_BMP); 一定要這樣用,否則會報錯的,這是我在
http://topic.csdn.net/u/20081214/21/D012F730-C165-4A4C-9B01-3E449C7CB48B.html發現的。
可能顯得很笨拙,折騰我3個小時,跟大家分享一下吧!干軟件的要團結!
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成