將 bmp 轉爲jpg

將bmp,png gif,jpg 格式之間的相互轉換,有很多類庫可以使用...jpeglib,Image, CxImage 等等....

其他我沒用過,我只用過CxImage....感覺還不錯...首先到

http://www.codeproject.com/bitmap/cximage.asp

下載Download full source files - 2.10 Mb   .

需要使用CxImage的時候#include  "ximage.h"

你的庫是不是把JPG給關掉了?
ximacfg.h
#define CXIMAGE_SUPPORT_JPG 1
調試時 如果要實現bmp->jpg 則必須打開
#define CXIMAGE_SUPPORT_BMP 1
#define CXIMAGE_SUPPORT_GIF 1
#define CXIMAGE_SUPPORT_JPG 1
以上爲必須打開,下面的隨便............
#define CXIMAGE_SUPPORT_PNG 0//
#define CXIMAGE_SUPPORT_MNG 0
#define CXIMAGE_SUPPORT_ICO 1
#define CXIMAGE_SUPPORT_TIF 0//
#define CXIMAGE_SUPPORT_TGA 0//
#define CXIMAGE_SUPPORT_PCX 0//
#define CXIMAGE_SUPPORT_WBMP 0//
#define CXIMAGE_SUPPORT_WMF 0//
#define CXIMAGE_SUPPORT_J2K 0  // Beta, use JP2
#define CXIMAGE_SUPPORT_JBG 0
其他的可以不打開
那麼 可以不導入 相應的 png.lib和tiff.lib
從CxImage中將xfile.h、ximacfg.h、ximadef.h、ximage.cpp、ximage.h、xiofile.h、xmemfile.cpp、xmemfile.h拷貝到工程文件夾下並將這些文件加入工程,然後將CxImage各文件夾下Debug文件夾中的lib文件也拷貝到工程下,並在VC中做如下設置

Project Settings
|- 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
|   |- Preprocessor
|       |- Additional Include Directories:  ../cximage(該處填CxImage裏的.h和.cpp文件拷貝並導入工程後所在的文件夾,填寫後在工程中include時編譯器會查找該文件夾,故include的文件無需路徑)
|- Link
    |- General
        |- Object/library modules: ../png/Debug/png.lib
                                   ../jpeg/Debug/jpeg.lib
                                   ../zlib/Debug/zlib.lib
                                   ../tiff/Debug/tiff.lib
                                   ../jasper/Debug/jasper.lib
                                    ../cximage/Debug/cximage.lib  (前面的路徑設爲從CxImage中拷貝到工程中的lib文件所在的目錄)

要在picture box中顯示一個png格式的文件,只需:
CxImage image("myfile.png", CXIMAGE_FORMAT_PNG);
HBITMAP m_bitmap = image.MakeBitmap(m_picture.GetDC()->m_hDC);
m_picture.SetBitmap(m_bitmap);
其它格式則類推。
Examples: how to ...
... convert from a format to another
CxImage  image;
// bmp -> jpg
image.Load("image.bmp", CXIMAGE_FORMAT_BMP);
if (image.IsValid()){
if(!image.IsGrayScale()) image.IncreaseBpp(24);
image.SetJpegQuality(99);
image.Save("image.jpg",CXIMAGE_FORMAT_JPG);
}
// png -> tif
image.Load("image.png", CXIMAGE_FORMAT_PNG);
if (image.IsValid()){
image.Save("image.tif",CXIMAGE_FORMAT_TIF);
}
... load an image resource
//Load the resource IDR_PNG1 from the PNG resource type
CxImage* newImage = new CxImage();
newImage->LoadResource(FindResource(NULL,MAKEINTRESOURCE(IDR_PNG1),
"PNG"),CXIMAGE_FORMAT_PNG);
or//Load the resource IDR_JPG1 from DLL
CxImage* newImage = new CxImage();
HINSTANCE hdll=LoadLibrary("imagelib.dll");
if (hdll){
HRSRC hres=FindResource(hdll,MAKEINTRESOURCE(IDR_JPG1),"JPG");
newImage->LoadResource(hres,CXIMAGE_FORMAT_JPG,hdll);
FreeLibrary(hdll);
}
or//Load a bitmap resource;
HBITMAP bitmap = ::LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1)));
CxImage *newImage = new CxImage();
newImage->CreateFromHBITMAP(bitmap);
... decode an image from memory
CxImage image((BYTE*)buffer,size,image_type);
orCxMemFile memfile((BYTE*)buffer,size);
CxImage image(&memfile,image_type);
orCxMemFile memfile((BYTE*)buffer,size);
CxImage* image = new CxImage();
image->Decode(&memfile,type);
... encode an image in memory
long size=0;
BYTE* buffer=0;
image.Encode(buffer,size,image_type);
...
free(buffer);
orCxMemFile memfile;
memfile.Open();
image.Encode(&memfile,image_type);
BYTE* buffer = memfile.GetBuffer();
long size = memfile.Size();
...
free(buffer);
... create a multipage TIFF
CxImage *pimage[3];
pimage[0]=&image1;
pimage[1]=&image2;
pimage[2]=&image3;
FILE* hFile;
hFile = fopen("multipage.tif","w+b");
CxImageTIF multiimage;
multiimage.Encode(hFile,pimage,3);
fclose(hFile);
orFILE* hFile;
hFile = fopen("c://multi.tif","w+b");
CxImageTIF image;
image.Load("c://1.tif",CXIMAGE_FORMAT_TIF);
image.Encode(hFile,true);
image.Load("c://2.bmp",CXIMAGE_FORMAT_BMP);
image.Encode(hFile,true);
image.Load("c://3.png",CXIMAGE_FORMAT_PNG);
image.Encode(hFile);
fclose(hFile);
... copy/paste an image
//copy
HANDLE hDIB = image->CopyToHandle();
if (::OpenClipboard(AfxGetApp()->m_pMainWnd->GetSafeHwnd())) {
if(::EmptyClipboard()) {
if (::SetClipboardData(CF_DIB,hDIB) == NULL ) {
AfxMessageBox( "Unable to set Clipboard data" );
}    }    }
CloseClipboard();
//paste
HANDLE hBitmap=NULL;
CxImage *newima = new CxImage();
if (OpenClipboard()) hBitmap=GetClipboardData(CF_DIB);
if (hBitmap) newima->CreateFromHANDLE(hBitmap);
CloseClipboard();
需要大家注意的是:整個CxImage類庫非常大。如果你只需要能處理其中的幾種格式,你可以在主要的頭文件ximage.h中找到一些開關選項來關閉一些圖像庫。JPG、PNG、TIFF中的每一個庫,都會向最終程序增加約100KB的內容。而CxImage類庫壓縮後只有約60KB。所以,你需要謹慎挑選一些你真正需要的類庫。作者提供的示例工程在編譯後,你會發現如下一些文件: ·CxImage : cximage.lib - static library ·CxImageCrtDll : cximagecrt.dll - DLL not using mfc ·CxImageMfcDll : cximage.dll - DLL using mfc ·Demo : demo.exe - program linked with cximage.lib and the C libraries ·DemoDll : demodll.exe - program linked with cximagecrt.dll ·j2k,jasper,jbig,jpeg,png,tiff,zlib : static C libraries 構建這些工程需要耗費幾分鐘的時間(中間文件可達60MB)。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章