C++实现Photoshop图层颜色混合模式
如何用程序代码准确地实现Photoshop的图层颜色混合模式,一直是程序员们热衷的话题。本人采用BCB2007和GDI+等工具,较好地实现了其主要功能(不考虑不透明度和填充选项)。
由于代码较长,这里不便贴出,详细代码及实现原理见我的BLOG文章:
《C++实现Photoshop图层颜色混合模式》
如果方便的话,请妖哥或者其他版主帮忙推荐一下,不胜感谢!
下面是2张运行效果图,其中对话框中显示的颜色误差是与Photoshop同等条件制作的图片进行的比较结果:
1、用颜色0x314ead对灰度图片进行着色效果图:
2、2张不同彩色图片进行进行颜色混合的效果图:
[最优解释]
来学习下了
[其他解释]
纯粹帮顶
[其他解释]
的确高人
[其他解释]
放分,接分,不要忘了我一份
[其他解释]
我来了,呵呵。感谢阿发伯。
[其他解释]
最近不少人都搞PS的功能。。。图像处理如此之火?
[其他解释]
发哥出手,必属精品啊!貌似现在大家都用VS,BCB没人用了吧。
[其他解释]
[其他解释]
看來不好學的樣子
[其他解释]
看看,学习下
[其他解释]
高人呀,C++ Delphi都整出来了
[其他解释]
学习。。
[其他解释]
牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
[其他解释]
牛人,学习一下
[其他解释]
果断接昏。
[其他解释]
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
[其他解释]
我又回来了,回头贴自己的程序,支持
[其他解释]
学习。。
[其他解释]
您太客气了,至少在图像处理领域,您绝对是大牛,我差得远了。
[其他解释]
嗯 确实很不错...非常值得参考
[其他解释]
路过,接分~~~~~~~~~~~~
[其他解释]
学习.
想做个人脸识别的,做不好,识别率太差了.
相机中的人脸识别就做得不错.
[其他解释]
再次学习。:)
[其他解释]
来了。分呢?
[其他解释]
不错不错,我就是喜欢图像处理,可是我没学过BCB,只会VC,弱弱地问一下Delphi里有指针码?
[其他解释]
纯粹帮顶
[其他解释]
真的不错
[其他解释]
mark too
[其他解释]
mark
[其他解释]
BCB版的人气真的低到了极点,连便宜分都没几人接了。。。。
[其他解释]
妖哥来了,也把人气带来了,呵呵。
那篇文章内容的算法废了我好多脑细胞,所以没怎么顾得上代码结构,显得有些零碎,比如同样的代码充斥在几个不同的函数中,不利于维护。所以,准备改进一下,发一个续篇,望大家多多捧场,以资鼓励,争取多破解一些PS算法。
[其他解释]
procedure Move(const Source; var Dest; count : Integer);
{$IFDEF PUREPASCAL}
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;
{$ELSE}
asm
cmp eax, edx
je @@Exit {Source = Dest}
cmp ecx, 32
ja @@LargeMove {Count > 32 or Count < 0}
sub ecx, 8
jg @@SmallMove
@@TinyMove: {0..8 Byte Move}
jmp dword ptr [@@JumpTable+32+ecx*4]
@@SmallMove: {9..32 Byte Move}
fild qword ptr [eax+ecx] {Load Last 8}
fild qword ptr [eax] {Load First 8}
cmp ecx, 8
jle @@Small16
fild qword ptr [eax+8] {Load Second 8}
cmp ecx, 16
jle @@Small24
fild qword ptr [eax+16] {Load Third 8}
fistp qword ptr [edx+16] {Save Third 8}
@@Small24:
fistp qword ptr [edx+8] {Save Second 8}
@@Small16:
fistp qword ptr [edx] {Save First 8}
fistp qword ptr [edx+ecx] {Save Last 8}
@@exit:
ret
nop {4-Byte Align JumpTable}
nop
@@JumpTable: {4-Byte Aligned}
dd @@Exit, @@M01, @@M02, @@M03, @@M04, @@M05, @@M06, @@M07, @@M08
@@LargeForwardMove: {4-Byte Aligned}
push edx
fild qword ptr [eax] {First 8}
lea eax, [eax+ecx-8]
lea ecx, [ecx+edx-8]
fild qword ptr [eax] {Last 8}
push ecx
neg ecx
and edx, -8 {8-Byte Align Writes}
lea ecx, [ecx+edx+8]
pop edx
@FwdLoop:
fild qword ptr [eax+ecx]
fistp qword ptr [edx+ecx]
add ecx, 8
jl @FwdLoop
fistp qword ptr [edx] {Last 8}
pop edx
fistp qword ptr [edx] {First 8}
ret
@@LargeMove:
jng @@LargeDone {Count < 0}
cmp eax, edx
ja @@LargeForwardMove
sub edx, ecx
cmp eax, edx
lea edx, [edx+ecx]
jna @@LargeForwardMove
sub ecx, 8 {Backward Move}
push ecx
fild qword ptr [eax+ecx] {Last 8}
fild qword ptr [eax] {First 8}
add ecx, edx
and ecx, -8 {8-Byte Align Writes}
sub ecx, edx
@BwdLoop:
fild qword ptr [eax+ecx]
fistp qword ptr [edx+ecx]
sub ecx, 8
jg @BwdLoop
pop ecx
fistp qword ptr [edx] {First 8}
fistp qword ptr [edx+ecx] {Last 8}
@@LargeDone:
ret
@@M01:
movzx ecx, [eax]
mov [edx], cl
ret
@@M02:
movzx ecx, word ptr [eax]
mov [edx], cx
ret
@@M03:
mov cx, [eax]
mov al, [eax+2]
mov [edx], cx
mov [edx+2], al
ret
@@M04:
mov ecx, [eax]
mov [edx], ecx
ret
@@M05:
mov ecx, [eax]
mov al, [eax+4]
mov [edx], ecx
mov [edx+4], al
ret
@@M06:
mov ecx, [eax]
mov ax, [eax+4]
mov [edx], ecx
mov [edx+4], ax
ret
@@M07:
mov ecx, [eax]
mov eax, [eax+3]
mov [edx], ecx
mov [edx+3], eax
ret
@@M08:
fild qword ptr [eax]
fistp qword ptr [edx]
end;
{$ENDIF}