wince上 怎么样PNG转成bmp呀?

金笛子 2008-08-21 09:11:58
wince上 怎么样PNG转成bmp呀?
...全文
166 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
quqiangx 2010-09-19
  • 打赏
  • 举报
回复
看看!
tanghongkai 2009-09-17
  • 打赏
  • 举报
回复
void LoadPngImage(HDC hdc, DWORD ImgID)
{
IImagingFactory* pImageFactory = 0;
IImage* pImage = 0;
ImageInfo imageInfo;
CoInitializeEx(0, COINIT_MULTITHREADED);
HBITMAP hBitmap = 0;
LPBYTE lpByte;
if (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory, 0, CLSCTX_INPROC_SERVER,

IID_IImagingFactory, (void**)&pImageFactory)))
{
HRSRC hr;//资源句柄
hr = FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(ImgID),_T("PNG"));
HGLOBAL hglobal= LoadResource(AfxGetResourceHandle(), hr );
LockResource(hglobal);
int nSize = 0;
nSize = (UINT)SizeofResource(AfxGetResourceHandle(), hr);
//if (SUCCEEDED(pImageFactory->CreateImageFromFile(filename, &pImage))&& SUCCEEDED(pImage->GetImageInfo(&imageInfo)))
if(SUCCEEDED(pImageFactory-> CreateImageFromBuffer((BYTE*)hglobal, nSize, BufferDisposalFlagNone ,&pImage))&& SUCCEEDED(pImage->GetImageInfo(&imageInfo)))
{
HDC bmpDC = CreateCompatibleDC(hdc);
//LPBYTE lpByte;
BITMAPINFO *pbinfo ;
pbinfo = (BITMAPINFO *)calloc(1,sizeof(BITMAPINFO) + 4 * sizeof(INT)) ;
if(!pbinfo)
return FALSE ;
pbinfo->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
pbinfo->bmiHeader.biWidth = imageInfo.Width ;
pbinfo->bmiHeader.biHeight = imageInfo.Height ;
pbinfo->bmiHeader.biPlanes = 1;
pbinfo->bmiHeader.biBitCount = 32;
pbinfo->bmiHeader.biCompression = BI_ALPHABITFIELDS;
pbinfo->bmiHeader.biSizeImage = 0 ;
pbinfo->bmiHeader.biXPelsPerMeter = 11811;
pbinfo->bmiHeader.biYPelsPerMeter = 11811;
pbinfo->bmiHeader.biClrUsed = 0;
pbinfo->bmiHeader.biClrImportant = 0;
int *pMask = (int*)&(pbinfo->bmiColors[0]) ;
*pMask++ = 0x00FF0000 ;
*pMask++ = 0x0000FF00 ;
*pMask++ = 0x000000FF ;
*pMask++ = 0xFF000000 ;
hBitmap = CreateDIBSection(NULL, pbinfo, DIB_RGB_COLORS, (void **)&lpByte, NULL, 0) ;
free(pbinfo) ;
if(!hBitmap || !lpByte)
return FALSE ;
RECT rect = {0, 0, imageInfo.Width, imageInfo.Height};
IBitmapImage *pBitmapImage;
BitmapData bitmapData;
bitmapData.Width = imageInfo.Width;
bitmapData.Height = imageInfo.Height;
bitmapData.PixelFormat = imageInfo.PixelFormat;
pBitmapImage = NULL;
pImageFactory->CreateBitmapFromImage(pImage, imageInfo.Width, imageInfo.Height,

PIXFMT_32BPP_ARGB,InterpolationHintDefault, &pBitmapImage);
pBitmapImage->LockBits(&rect, ImageLockModeRead,PIXFMT_32BPP_ARGB, &bitmapData);
//transferring the pixels
memcpy(lpByte, bitmapData.Scan0, imageInfo.Width * imageInfo.Height * 4);
pBitmapImage->UnlockBits(&bitmapData);
UnlockResource(hglobal);
pBitmapImage->Release();
pImage->Release();
DeleteDC(bmpDC);
}
pImageFactory->Release();
}
CoUninitialize();
//ProcessThePixelsWithAlphaChannel Here
// vertical flip and ProcessThePixelsWithAlphaChannel here
for (UINT y=0; y<imageInfo.Height/2; y++)
{
BYTE * pPixel = (BYTE *) lpByte + imageInfo.Width * 4 * y;
BYTE * pDstPixel = (BYTE*) lpByte + imageInfo.Width * 4 * (imageInfo.Height-y-1);
for (UINT x=0; x<imageInfo.Width; x++)
{
pPixel[0] = pPixel[0] * pPixel[3] / 255;
pPixel[1] = pPixel[1] * pPixel[3] / 255;
pPixel[2] = pPixel[2] * pPixel[3] / 255;
pDstPixel[0] = pDstPixel[0] * pDstPixel[3] / 255;
pDstPixel[1] = pDstPixel[1] * pDstPixel[3] / 255;
pDstPixel[2] = pDstPixel[2] * pDstPixel[3] / 255;
INT* pOrigin = (INT*)pPixel;
INT* pDst = (INT*)pDstPixel;
INT temp = *pOrigin;
*pOrigin = *pDst;
*pDst = temp;
pPixel += 4;
pDstPixel += 4;
}
}
return hBitmap;
}
金笛子 2008-08-21
  • 打赏
  • 举报
回复
谢谢 真的可以!搞定了 结婚!
金笛子 2008-08-21
  • 打赏
  • 举报
回复
我这边不需要生成bmp文件 只是想得到bmp的位图句柄 然后就放到ddraw的 surface上来显示的!

Really 可以再具体说说吧?

我先试试 看看 然后再请教你吧!
Reallyu 2008-08-21
  • 打赏
  • 举报
回复
先用 IImage 把 png 读到内存,然后创建个设备无关的位图,把 png 画到位图上,最后再写到文件里

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧