我把幾十個8位圖在記憶體DC里拼成了一張大圖,用Cimage保存后變成32位,體積太大!GDI竟連保持原圖位深的功能都沒有?請教怎樣保存成8位而且不失真?? 最簡單的方法是什么??
uj5u.com熱心網友回復:
Color FunctionsThe following functions are used with color.
AnimatePalette
CreateHalftonePalette
CreatePalette
GetColorAdjustment
GetNearestColor
GetNearestPaletteIndex
GetPaletteEntries
GetSystemPaletteEntries
GetSystemPaletteUse
HTUI_ColorAdjustment
HTUI_DeviceColorAdjustment
RealizePalette
ResizePalette
SelectPalette
SetColorAdjustment
SetPaletteEntries
SetSystemPaletteUse
UnrealizeObject
UpdateColors
uj5u.com熱心網友回復:
我只想把位圖按原始8位無損輸出罷了,這么麻煩?
uj5u.com熱心網友回復:
可能·拼接·時已經是 32 位了,先 拼一個看看。
uj5u.com熱心網友回復:
如果能保存成8位,我就不來問了
uj5u.com熱心網友回復:
用· bmp 檔案·拼接·不可能·變 32 位的你是 用 CDC 拼接 的 ?
uj5u.com熱心網友回復:
給·一個·直接檔案處理的
void CPartialBitmapView::MergePartialBmp(char *MergeFile,char *MergedFile)
{
// 1st get MergedFile's bits.
FILE *bmpDst=0;
bmpDst=fopen(MergedFile,"rb");
if(!bmpDst)
{
AfxMessageBox("MergedFile Lost!");
CreateEmptyMergedFile(MergedFile);
}
// reopen
bmpDst=fopen(MergedFile,"rb");
fseek(bmpDst,0L,SEEK_END);
LONG filelenDst=ftell(bmpDst);
fseek(bmpDst,0L,SEEK_SET);
BYTE *bufferDst=new BYTE[filelenDst];
fread(bufferDst,sizeof(char),filelenDst,bmpDst);
fclose(bmpDst);
//
LPBITMAPFILEHEADER pBMPfileDst=(LPBITMAPFILEHEADER) bufferDst;
LPBITMAPINFOHEADER pBMPinfoDst=(LPBITMAPINFOHEADER) (bufferDst+sizeof(BITMAPFILEHEADER));
int colord=0;//
if(pBMPinfoDst->biBitCount==8)
{
colord=256;
}
// width height and bits
WORD widDst=(WORD)pBMPinfoDst->biWidth;// 640
WORD heiDst=(WORD)pBMPinfoDst->biHeight;// 480
BYTE *bitsDstAt=bufferDst+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colord*sizeof(RGBQUAD);//=4;
RGBQUAD *rgbDst=(RGBQUAD*)(bufferDst+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
//// 2nd get MergeFile's bits. ///////////////////////////////////////////////
FILE *bmpSrc=https://bbs.csdn.net/topics/0;
bmpSrc=https://bbs.csdn.net/topics/fopen(MergeFile,"rb");
if(!bmpSrc)
{// check "tmp.bmp"
AfxMessageBox("No Source file!");
SavePartialBmp(m_Tracker.m_rect.left,m_Tracker.m_rect.top,m_Tracker.m_rect.right,
m_Tracker.m_rect.bottom);
}
// reopen
bmpSrc=https://bbs.csdn.net/topics/fopen(MergeFile,"rb");
fseek(bmpSrc,0L,SEEK_END);
LONG filelenSrc=https://bbs.csdn.net/topics/ftell(bmpSrc);// 17462
fseek(bmpSrc,0L,SEEK_SET);
BYTE *bufferSrc=https://bbs.csdn.net/topics/new BYTE[filelenSrc];
fread(bufferSrc,sizeof(char),filelenSrc,bmpSrc);
fclose(bmpSrc);
LPBITMAPFILEHEADER pBMPfileSrc=https://bbs.csdn.net/topics/(LPBITMAPFILEHEADER) bufferSrc;
LPBITMAPINFOHEADER pBMPinfoSrc=https://bbs.csdn.net/topics/(LPBITMAPINFOHEADER) (bufferSrc+sizeof(BITMAPFILEHEADER));
// merging pos
int Xstart=pBMPfileSrc->bfReserved1;
int Ystart=pBMPfileSrc->bfReserved2;
//afxDump << Xstart << ";" << Ystart << "\n";// 256;192
int colors=0;//
if(pBMPinfoSrc->biBitCount==8)
{
colors=256;
}
WORD widSrc=https://bbs.csdn.net/topics/(WORD)pBMPinfoSrc->biWidth;// 128
WORD heiSrc=https://bbs.csdn.net/topics/(WORD)pBMPinfoSrc->biHeight;// 128
WORD Xend=Xstart+widSrc;
WORD Yend=Ystart+heiSrc;
//afxDump << Xend << ";" << Yend << "\n";// 384;320
BYTE *bitsSrcAt=bufferSrc+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);
// Pallete
RGBQUAD *rgbSrc=https://bbs.csdn.net/topics/(RGBQUAD*)(bufferSrc+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// copy Pallete
if(colors==256)
{
memcpy(rgbDst,rgbSrc,colors*sizeof(RGBQUAD));
}
int BPP=pBMPinfoDst->biBitCount/8;
// now copy bits
for(int hei=Yend-1;hei >= Ystart;hei--)// vertical flip
{//
for(int wid=Xstart;wid < Xend;wid++)
{
// bitsDstAt[ (heiDst-hei-1)*widDst+wid] =bitsSrcAt[ (heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart)];//
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP];//
if(BPP>=3)
{// 24
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP+1]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP+1];//
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP+2]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP+2];//
}
if(BPP==4)
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP+3]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP+3];//
}
}
// write back
bmpDst=fopen(MergedFile,"wb");
fwrite(bufferDst,1,filelenDst,bmpDst);
fclose(bmpDst);
//
if(bufferSrc) delete [] bufferSrc;
if(bufferDst) delete [] bufferDst;
//
AfxMessageBox("Bmp Merged!");
}
1 被merge的檔案的位置在
// merging pos
int Xstart=pBMPfileSrc->bfReserved1;
int Ystart=pBMPfileSrc->bfReserved2;
2 那個包含所有 merge 檔案本身 必須 先創建(足夠大,帶調色板)
uj5u.com熱心網友回復:
我是把幾張8位圖通過LoadImage加載,再畫到記憶體DC上拼接成一張大圖的,有沒有辦法在我現有的基礎上保存成8位圖?
uj5u.com熱心網友回復:
如果樓主不間接或直接呼叫1樓給出的調色板相關API或寫一段類似其功能的代碼,我把頭給你!
uj5u.com熱心網友回復:
這些API確實用不上,我現在想到的辦法是把這個32位的圖片用原來的調色板還原成8位,因為這個32位圖是從8位轉換的,所以顏色數不超過256種,那么完全可以無損還原成8位圖吧?難道論壇的老前輩們還不如我這個后輩的點子多?應該是都藏著掖著怕別人學會吧
uj5u.com熱心網友回復:
"可以無損還原成8位圖" 不保證 !uj5u.com熱心網友回復:
誰操作調色板,竟然可以不“間接或直接呼叫1樓給出的調色板相關API或寫一段類似其功能的代碼”?!
uj5u.com熱心網友回復:

8位應該也ok吧,你找個hdc保存bmp 8位的代碼即可。
uj5u.com熱心網友回復:
為什么要用 CImage,直接用 Windows 的 GDI API 去拼接,最后還是得到一個 HBITMAP,將 HBITMAP 中的資訊保存為 bmp 檔案,代碼網上很多。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/78363.html
標籤:圖形處理/算法
