CString fnBmp = "E:\\Projects\\x.bmp";
CImage im;
im.Load(fnBmp);
CString mypng = "E:\\Projects\\x.png";
//這中間添加什么樣的代碼?
im.Save(mypng,Gdiplus::ImageFormatPNG);
多謝
uj5u.com熱心網友回復:
這個代碼不是已經完整了么? 還有什么問題?uj5u.com熱心網友回復:
需要透明的PNG
找了一段
void CrossImage(CImage &img) //對像素進行轉換
{
for(int i=0; i<img.GetWidth(); i++)
{
for(int j=0; j<img.GetHeight(); j++)
{
UCHAR *cr = (UCHAR*) img.GetPixelAddress(i,j);
cr[0] = cr[0]*cr[3] / 255;
cr[1] = cr[1]*cr[3] / 255;
cr[2] = cr[2]*cr[3] / 255;
}
}
}
CString fnBmp = "E:\\Projects\\x.bmp";
CImage im;
im.Load(fnBmp);
CrossImage(im);//加上這個
im.Save(mypng,Gdiplus::ImageFormatPNG);
這樣應該是透明的吧
uj5u.com熱心網友回復:
透明不透明可以查看下圖片的屬性,相信資訊中的位深度,如果是32那么就是有a通道的圖了,你那個轉換,沒看出有啥特別處理的地方uj5u.com熱心網友回復:
void AlphaBmp()
{
Bitmap OldBmp(L"red24.bmp");
int w = OldBmp.GetWidth();
if(w==0) return;
int h=OldBmp.GetHeight();
if(h==0) return;
//
Bitmap newBmp(w,h,PixelFormat32bppPARGB);
for(int i=0; i<h; i++)
{
BYTE a=128;//cr.GetA();
Color cr;
for(int j=0; j<w; j++)
{
OldBmp.GetPixel(j,i,&cr);
newBmp.SetPixel(j,i,Color(a,cr.GetR(),cr.GetG(),cr.GetB()));
}
}
//
CLSID Clsid;
GetEncoderClsid(L"image/png", &Clsid);
WCHAR fileName[60]= L"HalfRed.png";
//
newBmp.Save(fileName,&Clsid);
AfxMessageBox("HalfRed.png Saved!");
}
使用 GDI+
24bit bmp to 32bit png
uj5u.com熱心網友回復:
逐像素整是不是效率奇低啊。
uj5u.com熱心網友回復:
與各像數的 alpha 有關,如果 都是 BYTE a=128; 應該快點uj5u.com熱心網友回復:
各點 alpha 不同:
for(int i=0; i<h; i++)
{
BYTE a;//=128;//cr.GetA();
Color cr;
for(int j=0; j<w; j++)
{
OldBmp.GetPixel(j,i,&cr);
COLORREF cref=cr.ToCOLORREF();
if( cref == RGB(255,255,255)) a=0; // 0 表示完全透明
else a=128;// 255表示不透明
newBmp.SetPixel(j,i,Color(a,cr.GetR(),cr.GetG(),cr.GetB()));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/105226.html
標籤:基礎類
