安阳网站建设推广优化自己建网站
以下方式都是在UI设计过程中,偶尔涉及到图像像素处理的时候用到的方式。如果追求专业的图像处理技术,还是采用OpenCV比较好,速度更高效,功能接口也更全面。
1、GDI方式
CImage &img; img.Load(lpszFileName);
if (img.IsNull())return;//确认该图像包含Alpha通道
if (img.GetBPP() != 32)return;for (int i = 0; i < img.GetWidth(); i++)
{for (int j = 0; j < img.GetHeight(); j++){UCHAR *cr = (UCHAR*)img.GetPixelAddress(i, j);unsigned char alpha = cr[3];if (alpha < 255){cr[0] = (cr[0] * cr[3] + 127) / 255;cr[1] = (cr[1] * cr[3] + 127) / 255;cr[2] = (cr[2] * cr[3] + 127) / 255;}}
}
2、GDI+方式
struct PixelData
{BYTE B;BYTE G;BYTE R;BYTE A;
};
Gdiplus::Bitmap * pImage = Gdiplus::Bitmap::FromFile(wszFileName);
if (Gdiplus::IsAlphaPixelFormat((Gdiplus::PixelFormat)pImage->GetPixelFormat()))
{Gdiplus::BitmapData source;Gdiplus::Rect rect(0, 0, pImage->GetWidth(), pImage->GetHeight());Gdiplus::Status status = pImage->LockBits(&rect, Gdiplus::ImageLockModeRead, pImage->GetPixelFormat(), &source);int nBitsPixel= GetPixelFormatSize(m_pBkgrBitmap->GetPixelFormat()) >> 3;ASSERT(nBitsPixel == 4);int nLinesize = m_pBkgrBitmap->GetWidth() * nBitsPixel;int nOffset = bitmapData.Stride - bitmapData.Width * nBitsPixel;PixelData* pPixel = (PixelData*)bitmapData.Scan0;if (status == Gdiplus::Ok) {for (int i = 0; i < pImage->GetWidth(); i++){for (int j = 0; j < pImage->GetHeight(); j++){UCHAR *cr = pPixel;if (pPixel->A < 255){ cr[0] = (cr[0] * cr[3] + 127) / 255;// Bcr[1] = (cr[1] * cr[3] + 127) / 255;// Gcr[2] = (cr[2] * cr[3] + 127) / 255;// R}pPixel++;}pPixel += bitmapData.Stride - (bitmapData.Width * nBitsPixel);// 字节对齐}pImage->UnlockBits(&source);}
}