首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

C++兑现Photoshop图层颜色混合模式

2012-12-14 
C++实现Photoshop图层颜色混合模式如何用程序代码准确地实现Photoshop的图层颜色混合模式,一直是程序员们

C++实现Photoshop图层颜色混合模式
    如何用程序代码准确地实现Photoshop的图层颜色混合模式,一直是程序员们热衷的话题。本人采用BCB2007和GDI+等工具,较好地实现了其主要功能(不考虑不透明度和填充选项)。
    由于代码较长,这里不便贴出,详细代码及实现原理见我的BLOG文章:
    《C++实现Photoshop图层颜色混合模式》
    如果方便的话,请妖哥或者其他版主帮忙推荐一下,不胜感谢!
    下面是2张运行效果图,其中对话框中显示的颜色误差是与Photoshop同等条件制作的图片进行的比较结果:
    1、用颜色0x314ead对灰度图片进行着色效果图:

    2、2张不同彩色图片进行进行颜色混合的效果图:


[最优解释]
来学习下了
[其他解释]
纯粹帮顶
[其他解释]
的确高人
[其他解释]
放分,接分,不要忘了我一份
[其他解释]
我来了,呵呵。感谢阿发伯。
[其他解释]
最近不少人都搞PS的功能。。。图像处理如此之火?
[其他解释]
      发哥出手,必属精品啊!貌似现在大家都用VS,BCB没人用了吧。
[其他解释]

引用:
BCB没人用了吧。


这么一说,令人伤心啊。但是欣慰的是,虽然C++Builder版块冷清,但是这个优秀的开发工具仍然有许多人在用。
[其他解释]

牛人。。。。
[其他解释]
帮老毛顶下
BCB确实没人气
[其他解释]
必须学习啊 
[其他解释]
学习一个
[其他解释]
真牛啊  羡慕一下
[其他解释]
进来膜拜5颗星 
[其他解释]
牛X人士
[其他解释]
mark
[其他解释]
引用:
引用:
BCB没人用了吧。


这么一说,令人伤心啊。但是欣慰的是,虽然C++Builder版块冷清,但是这个优秀的开发工具仍然有许多人在用。


虽然工具使用的人不多,但是C++Builder版块依然如火如荼!

= =#
[其他解释]
貌似BCB和VC也差不多,楼主也可以考虑换到BCB。
VC就是快速开发比BCB差点,其它的我感觉还是一样的用。没啥蛮大的区别。
[其他解释]
PS都有了,我们干嘛还要自己编?
[其他解释]
顶一下牛人
[其他解释]
学习一下!
[其他解释]
看了楼主的博文《简洁代码一定比复杂代码效率高吗?》
不知楼主考虑过memcpy如下:
方案1:memcpy最原始的;
方案2:memcpy_fast类似楼主的strlen2;
方案3:在数据较少或不确定对齐用memcpy8,
          在数据较多且确定对齐用memcpy32.

 不知阿法伯的看法?

[其他解释]
同一楼 
[其他解释]
谢谢分享,学习了!!!
------其他解决方案--------------------


不错,看看
[其他解释]
学习,帮顶一下
[其他解释]
不错。接分。。
[其他解释]
支持发哥
[其他解释]
膜拜。。。。
[其他解释]
哇塞 还厉害啊
[其他解释]
太好了。
[其他解释]
膜拜啊
[其他解释]
感谢楼主分享
[其他解释]
感谢阿发伯,期待续篇
[其他解释]
好东西
[其他解释]
支持並學習。
[其他解释]
学习了 接分 楼主牛人
[其他解释]
顶。
[其他解释]
学习,谢谢
[其他解释]
学习
学习

[其他解释]
支持,接分
[其他解释]
高人,学习,非常感谢

[其他解释]
顶一下
[其他解释]
支持 & 学习


[其他解释]
正需要呢
[其他解释]
GOOD
[其他解释]
学习~
[其他解释]
路过。。。
[其他解释]
维尔沃尔特饿他
[其他解释]
额外日份额问题染发俄文
[其他解释]
维尔early4
[其他解释]
有空的时候想学学
[其他解释]
没做过呵呵
[其他解释]

引用:
妖哥来了,也把人气带来了,呵呵。
那篇文章内容的算法废了我好多脑细胞,所以没怎么顾得上代码结构,显得有些零碎,比如同样的代码充斥在几个不同的函数中,不利于维护。所以,准备改进一下,发一个续篇,望大家多多捧场,以资鼓励,争取多破解一些PS算法。


大部分图层混合的模式都是已经总结出来的了,也不太需要自己想办法破解了吧~~
前段时间写了一篇关于图层混合的文章,多多指教:
http://www.xiangwangfeng.com/2011/02/26/%E5%9B%BE%E5%83%8F%E7%BC%96%E8%BE%91%E4%B9%8B%E5%9B%BE%E5%B1%82%E6%B7%B7%E5%90%88/
(PS:刚开始做图像编辑相关的东西时从你的博客中吸取了很多经验~~~赞一个~~~)

[其他解释]
顶一个!!!学习了
[其他解释]
用汇编能达到这个效果吗?
[其他解释]
这个还真是第一次见到  我是不是out了


[其他解释]
看來不好學的樣子

[其他解释]
 看看,学习下
[其他解释]
高人呀,C++ Delphi都整出来了
[其他解释]
学习。。
[其他解释]
牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。

学习。。。牛人。。
[其他解释]
牛人,学习一下
[其他解释]
果断接昏。
[其他解释]
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。
学习。。。牛人。。

学习。。。牛人。。


[其他解释]
我又回来了,回头贴自己的程序,支持
[其他解释]
学习。。
[其他解释]
您太客气了,至少在图像处理领域,您绝对是大牛,我差得远了。

[其他解释]
嗯 确实很不错...非常值得参考
[其他解释]
路过,接分~~~~~~~~~~~~
[其他解释]
学习. 
想做个人脸识别的,做不好,识别率太差了. 
相机中的人脸识别就做得不错.

[其他解释]
再次学习。:)

[其他解释]
来了。分呢?
[其他解释]
不错不错,我就是喜欢图像处理,可是我没学过BCB,只会VC,弱弱地问一下Delphi里有指针码?
[其他解释]
纯粹帮顶
[其他解释]
真的不错
[其他解释]
mark  too
[其他解释]
mark
[其他解释]
BCB版的人气真的低到了极点,连便宜分都没几人接了。。。。
[其他解释]
妖哥来了,也把人气带来了,呵呵。
那篇文章内容的算法废了我好多脑细胞,所以没怎么顾得上代码结构,显得有些零碎,比如同样的代码充斥在几个不同的函数中,不利于维护。所以,准备改进一下,发一个续篇,望大家多多捧场,以资鼓励,争取多破解一些PS算法。
[其他解释]

引用:
看了楼主的博文《简洁代码一定比复杂代码效率高吗?》
不知楼主考虑过memcpy如下:
方案1:memcpy最原始的;
方案2:memcpy_fast类似楼主的strlen2;
方案3:在数据较少或不确定对齐用memcpy8,
  在数据较多且确定对齐用memcpy32.

 不知阿法伯的看法?

可参见Delphi2007里面的Move过程,其中的pascal代码是最原始的,汇编码则可满足其余条件:

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}


[其他解释]
该回复于2011-07-12 10:18:47被版主删除
[其他解释]
已完成《C++实现Photoshop图层颜色混合模式(续)》
对代码结构重新进行了组织,作了一些优化,增强了代码的通用性和可维护性。
欢迎大家继续捧场!
[其他解释]
利用颜色混合代码实现Photoshop图像黑白调整:
C++实现Photoshop图像黑白调整
[其他解释]
利用颜色混合代码实现Photoshop图像黑白调整:
《C++实现Photoshop图像黑白调整》
效果图:


[其他解释]
引用:
再次学习。:)

惭愧!你的技术水平比我高多了,知识面也比我宽多了。
------其他解决方案--------------------



赞阿发伯!
[其他解释]
不错,真的不错。
[其他解释]
感谢阿发伯,图形教父

热点排行