提高setpixel()效率,即颜色值直接赋给位图显示的问题解决

在MFC项目中,为解决图像显示效率低下的问题,作者通过直接赋值方法替代SetPixel(),利用SetDIBits和SetBitmapBits API函数提高位图数据填充效率。项目涉及大量数据计算与图像表现,通过双缓冲和分块显示优化绘制过程。同时,讨论了其他提高效率的方案,如OPENGL、DIRECTX以及多线程创建后台临时文件。
摘要由CSDN通过智能技术生成

最近在做的项目是在MFC的框架下的,我主要负责图像的绘制显示部分。是在对方框架下做插件功能,对方给出的绘图DEMO是用fillsolidrect()与SetPixel(),显示效率很低。项目的主要内容是把大量数据通过计算转换,然后赋予颜色值,通过图像来表现巨幅的井文件。呃,闲话不多说了~~~~~~~

我只说绘制部分,当然也是分块显示,即只绘当前屏幕内容,通过双缓冲实现,先绘制到内存DC,然后再贴到屏幕上。

我这两天做的修改是把效率极低的setpixel()用直接给点赋值的方法代替。就是相当于把表示颜色值BYTE的数组直接赋值给位图显示,而不是再经过先绘制到位图再显示。

考虑到效率,直接调用了API函数。经过查询有两个函数可以实现的比较好,这两个函数都能将位图数据填到位图中去,SetDIBits和SetBitmapBits,前者是对于设备无关位图的,后者是对相关位图的。

int SetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits,CONST BITMAPINFO *lpbmi, UINT fuColorUse);
参数:
hdc:指向设备环境中的句柄。
hbmp:指向位图的句柄。函数要使用指定DIB中的颜色数据对该位图进行更改。
uStartScan:为参数lpvBits指向的数组中的、与设备无关的颜色数据指定起始扫描线。
cScanLines:为包含与设备无关的颜色数据的数组指定扫描线数目。
lpvBits:指向DIB颜色数据的指针,这些数据存储在字节类型的数组
在Android开发中,setPixel()是一个用于设置像素颜色的方法。该方法用于修改Bitmap中的像素点的颜色,可以实现图像处理、绘制等功能。 然而,在使用setPixel()方法时需要注意它的效率setPixel()方法是一个比较耗时的操作,因为它需要遍历整个Bitmap来逐个修改像素点的颜色。如果在遍历操作中频繁调用setPixel()方法,会导致耗时增加,影响应用的性能和响应速度。 为了提高setPixel()方法的效率,可以采用以下几种优化措施: 1. 减少setPixel()的调用次数:可以将需要修改的像素点信息存储到一个数组中,然后使用setPixels()方法一次性修改多个像素点的颜色,这样可以节省多次调用setPixel()的开销。 2. 使用Bitmap的getPixels()和setPixels()方法:getPixels()方法可以获取Bitmap中所有像素点的颜色,然后进行批量处理,处理完成后再使用setPixels()方法将修改后的颜色写入Bitmap。这样可以避免一次次调用setPixel()方法,提高处理效率。 3. 使用JNI来优化:可以通过JNI实现对底层的图形处理库的调用,直接在C/C++层进行像素点的处理,避免Java层的setPixel()方法调用,提升效率。 总的来说,为了提高setPixel()方法的效率,我们应该减少其调用次数,优化算法逻辑,并且可以考虑使用JNI技术来进行底层的处理,以提高Android应用的性能和响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值