|
本帖最后由 anyuezhiji 于 2024-7-16 15:12 编辑
FreeImage.ec.zip
(33.56 KB, 下载次数: 14)
增加了一个函数,裁剪Ex,具体测试看这里
优化了粘贴透明图到,核心代码如下:
. . .
.
. . 源指针 = 取像素点阵指针 ()源字节集 = 指针到字节集 (源指针 - 8, 8 )写到内存 (到整数 (源高度 × 源宽度 × 4 ), 到整数 (源指针 - 4 ), 4 )写到内存 (1, 到整数 (源指针 - 8 ), 4 )写到内存 (到整数 (源指针 - 8 ), 取变量地址 (源像素 ), 4 )目标指针 = 粘贴到的目的FreeImage. 取像素点阵指针 ()目标字节集 = 指针到字节集 (目标指针 - 8, 8 )写到内存 (到整数 (目标高度 × 目标宽度 × 4 ), 到整数 (目标指针 - 4 ), 4 )写到内存 (1, 到整数 (目标指针 - 8 ), 4 )写到内存 (到整数 (目标指针 - 8 ), 取变量地址 (目标像素 ), 4 ) 计次循环首 (粘贴宽, 计次宽 ) 如果真 (宽始 - 1 + 计次宽 < 1 )  计次宽 = 2 + 宽始  到循环尾 () 计次循环首 (粘贴高, 计次高 )  如果真 (高始 - 1 + 计次高 < 1 )   计次高 = 2 + 高始   到循环尾 () 源位置 = 计次宽 - 1 ��� (源高度 - 计次高) × 源宽度  目标位置 = 宽始 - 1 + 计次宽 - 1 � �� (目标高度 � �� (计次高 + 高始 - 1 )) × 目标宽度   源透明 = 源像素 [4 + 4 × 源位置 ]  目标透明 = 目标像素 [4 + 4 × 目标位置 ]  目标像素 [1 + 4 × 目标位置 ] = (目标像素 [1 + 4 × 目标位置 ] × 目标透明 � � (255 - 源透明 ) \ 255 + 源像素 [1 + 4 × 源位置 ] × 源透明 ) \ 255   目标像素 [2 + 4 × 目标位置 ] = (目标像素 [2 + 4 × 目标位置 ] × 目标透明 � � (255 - 源透明 ) \ 255 + 源像素 [2 + 4 × 源位置 ] × 源透明 ) \ 255   目标像素 [3 + 4 × 目标位置 ] = (目标像素 [3 + 4 × 目标位置 ] × 目标透明 � � (255 - 源透明 ) \ 255 + 源像素 [3 + 4 × 源位置 ] × 源透明 ) \ 255   目标像素 [4 + 4 × 目标位置 ] = (255 × 255 � �� (255 - 目标透明 ) � � (255 - 源透明 )) \ 255  计次循环尾 () 计次循环尾 ()写到内存 (目标字节集, 到整数 (目标指针 - 8 ), 8 )写到内存 (源字节集, 到整数 (源指针 - 8 ), 8 )写到内存 (0, 取变量地址 (源像素 ), 4 )写到内存 (0, 取变量地址 (目标像素 ), 4 ) . . .
.
. . . .
.
从注释掉的版本不难看出,尝试了多种方案,有的效果不行,比如FreeImage_Paste粘贴无透明效果了
FreeImage_Get/SetPixelColor效果不行速度慢等
最新优化,取像素点阵 ()需要从内存复制一份数据,干脆用改写内存的方式直接从原地址创建字节集来操作
创建字节集时破坏了8个字节,这会破坏图片的头部数据,所以先保存起来,处理完图片再写回去
注:
1、用这个函数把透明图粘贴到背景,不会因色差出现锯齿
2、如果是两个透明图粘贴,粘贴完还是透明的(只要两个图的非透明区域没重叠)
应该没法再优化了,除非上汇编或者多线程,或者直接改FreeImage的源码重编译DLL
多帧动图的读取、格式转换、保存、透明粘贴等功能后续陆续会做吧,不清楚有需要的么有需要的易友点个支持哦~
|
|