WINCE下要对PNG图片进行AlphaBlend操作怎么做?AlphaBlend是不是只能对BMP图片进行操作?

xqhrs232 2010-07-29 09:12:41
WINCE下要对PNG图片进行AlphaBlend操作怎么做?AlphaBlend是不是只能对BMP图片进行操作?
...全文
579 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2010-08-02
  • 打赏
  • 举报
回复
为什么我写的程序在M8上运行得很慢,只有iphone上速度的3分之1?!

http://bbs.meizu.com/archiver/tid-998781-page-1.html
qthsrs232 2010-08-02
  • 打赏
  • 举报
回复
测试您的Windows CE设备的界面性能,支持Windows CE5和Windows CE6

http://www.wceui.cn/blog/article/test_ui_ce5_ce6.html
qthsrs232 2010-08-02
  • 打赏
  • 举报
回复
6410+wince60下GDI操作速度不行的解决方法

http://topic.csdn.net/u/20100308/20/4cfc2b02-6bf7-4749-9b3c-aef1dcf3ecaa.html

呵呵,我那个问题早已经解决了。

我这里是在WINCE6.0平台下的:

Bitblt的优化:打开显示驱动的precomp.h,里面有个G2D_ACCELERATE,这个是是否使用
三星2D加速的总开关,关闭它,Bitblt可以优化到9MS的样子,不关大概
20到30MS的样子吧!
alphablend: precomp.h中,打开G2D_ACCELERATE,针对alphablend的宏设置如下:
C/C++ code #define G2D_BYPASS_HW_ALPHABLEND (FALSE) //ture
/// Below is suboption
/// In our HW PPA feature has different bleding equation to SW.
#define G2D_BYPASS_PERPIXEL_ALPHABLEND (FALSE)
/// In our HW SCA feature does not change alphavalue, so this can lead to test fail when repetive alphablending.
#define G2D_BYPASS_SOURCECONSTANT_ALPHABLEND (FALSE)
/// This will run HW Bitblt twice, one for SCA and other for PPA, The result has incorrect alphabit
#define G2D_BYPASS_2STEP_PROCESS_PPA_AFTER_SCA (FALSE)

设置好后重编显示驱动更新NK,alphablend可由原来的38MS变到2到4MS的样子。

STRETCHBLT的设置:同样在precomp.h里面,打开G2D_ACCELERATE,将G2D_BYPASS_HW_STRETCHBLT设置为0,可由原来的200MS左右的时间优化为14MS左右。
xqhrs232 2010-07-31
  • 打赏
  • 举报
回复
菜鸟求救,mobile 上快速显示带有渐变色的png图像

http://topic.csdn.net/u/20100327/09/4e1c4a70-a564-44dc-8cd0-7f217ad9c605.html
xqhrs232 2010-07-31
  • 打赏
  • 举报
回复
Windows mobile画PNG图片效率问题!

http://www.devdiv.net/bbs/thread-17475-2-1.html
xqhrs232 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qthsrs232 的回复:]
找到了一个更快的方法!!!
Windows Mobile 显示PNG图片http://blog.csdn.net/ice520301/archive/2009/12/25/5075367.aspx
[/Quote]

不过384*320的PNG图片还是要73(加载)+110(画)MS的时间,时间还是很长啊!下一步看看LIBPNG或者CXIMAG的效率!!!
qthsrs232 2010-07-31
  • 打赏
  • 举报
回复
找到了一个更快的方法!!!
Windows Mobile 显示PNG图片http://blog.csdn.net/ice520301/archive/2009/12/25/5075367.aspx
xqhrs232 2010-07-31
  • 打赏
  • 举报
回复
不过速度挺慢的,384*320的PNG图片画出来要1277MS,时间太长了.看来用IMAGE组件真的效率不行啊!!!

不知道LIBPNG跟CXIMAGE接口的效率怎么样!
xqhrs232 2010-07-31
  • 打赏
  • 举报
回复
最近一直看到有人在问这个PNG的东西,正好在工作的时候也用得到,就找了几个图片试了一下.从wince开始引入了IImage的支持,这样我们可以用IImage来load 这些图片. 大致的流程很多地方都有:

CoCreateInstance创建IImagingFactory, 然后用CreateImageFromFile创建IImage的接口,最后把这个IImage用draw的接口画到DC.但是问题在于这个Draw是没有设置transparent属性的? 这个东西应该如何操作呢? 在网上看到了一个解决方案. 就是把这个png图片转化成一张32位的bitmap,然后再透明的画到DC上.这里有一段调试成功的代码:



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xcj_ysu/archive/2009/11/17/4824240.aspx

HBITMAP LoadPngImage2 (HDC hdc, LPCTSTR filename)
{
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)))
{
if (SUCCEEDED(pImageFactory->CreateImageFromFile(filename, &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);
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;
}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xcj_ysu/archive/2009/11/17/4824240.aspx
xqhrs232 2010-07-31
  • 打赏
  • 举报
回复
总算找到了一个方法!!!

windows mobile 画png图片-----WINCE下也可以用!!!

http://blog.csdn.net/xcj_ysu/archive/2009/11/17/4824240.aspx
xqhrs232 2010-07-30
  • 打赏
  • 举报
回复
今天仔细观察了一下还是透出了点东西,应该说原理上是通的了.
xqhrs232 2010-07-30
  • 打赏
  • 举报
回复
收集几个帖子

使用CImage显示透明的PNG图片
http://www.gliage.com/Automo/index.php/article/news/2010-03-24/868.html

win mobile 5显示jpg,png,gif图片的方法--5mbox的图片库封装

http://blog.chinaunix.net/u/26691/showart_447882.html



想根据 PNG的 ALPHA通道来 抠像素 如何获取 alpha通道
http://www.devdiv.net/bbs/archiver/tid-25095.html
nommm 2010-07-30
  • 打赏
  • 举报
回复
想要得到透明效果,是不是要把图像放在不同的framebuffer上,并设置alpha值啊
xqhrs232 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 reallyu 的回复:]
BLENDFUNCTION 中 SourceConstantAlpha 设置成 255
AlphaFormat = AC_SRC_ALPHA
保证的你的bmp是32bit带alpha通道的
就可以了
[/Quote]

这样带ALPHA通道的图片是可以显示出来了,但通过这个图片看不到背景图片啊.那就是还没有透明显示.
BMP图片肯定是没有问题的,我看BMP的数据是在每个像素数据后面多出了一个表示ALPHA值的字节.
BMP也是32位的.还有SourceConstantAlpha设置为0图片压根就看不见,为什么?为0不是说透明吗?
Reallyu 2010-07-30
  • 打赏
  • 举报
回复
BLENDFUNCTION 中 SourceConstantAlpha 设置成 255
AlphaFormat = AC_SRC_ALPHA
保证的你的bmp是32bit带alpha通道的
就可以了
xqhrs232 2010-07-30
  • 打赏
  • 举报
回复
整了个32位带ALPHA通道的BMP图片,但怎么透明不了呢?在AlphaBlend函数里面设置ALPHA值为0时BMP图片压根就没显示(看不见),
在AlphaBlend函数里面设置ALPHA值为1时BMP图片是看见了,但没有透明啊,背景图片被完全盖住了,要做到真正的透明对图片是不是要求很高?图片要特别处理?


AlphaBlend函数跟TransparentBlt函数的最大区别是什么?


1》TransparentBlt函数只能透掉某一种颜色?就像COLOR KEY一样?
2》AlphaBlend函数能够渐变显示?ALPHA值为0透明,为1模糊?
qthsrs232 2010-07-30
  • 打赏
  • 举报
回复
有了PNG的数据怎么存成一个HBITMAP对象?CreateCompatibleBitmap?CreateDIBSection?
qthsrs232 2010-07-30
  • 打赏
  • 举报
回复
发现一个怪问题,PNG用IMAGE接口的DRAW可以画到当前的窗体上,但不能临事转存画在用CreateCompatibleDC函数创建的DC上,为什么?如果可以临时转存那就可以在画到当前窗体前做一下AlphaBlend的操作.好奇怪!!!
xqhrs232 2010-07-30
  • 打赏
  • 举报
回复
xqhrs232 2010-07-29
  • 打赏
  • 举报
回复
在网上看到要用IMAGE组件访问PNG图片的像素数据有下面的几步

1》CreateImageFromFile得到IImage接口
2》CreateBitmapFromImage得到IBitmapImage接口
3》IBitmapImage得到BitmapData数据结构
4》BitmapData----Scan0就是PNG图片第一行的像素数据

这样得到有什么作用,是不是还是要转存成BMP才能开始用AlphaBlend函数???
加载更多回复(1)

19,502

社区成员

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

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