如何实现类似Photoshop的图层功能?

wxj_lake 2001-02-09 06:23:00
每个图层都是透明显示,任意缩放,请问有没有对此有研究的高手,拜托给一点思路吧,先行谢过!
...全文
382 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
classfactory 2001-02-11
  • 打赏
  • 举报
回复

这个问题我也曾考虑过,我的一些想法如下,供你参考:

1、图层用两个数组表示,一个是图像颜色数据,一个是mask,即表示数据中哪些象素是有效的。这种方法几乎是唯一的,因为象Win32中在一个位图中指定一种颜色是透明色显然是不合适的。可以设计如下的数据结构:

class CLayer
{
CString m_strName; // 层名称

int m_cxLayer; // 层宽度,可以与图像大小不一样
int m_cyLayer; // 层高度
int m_xOffset; // 偏移量
int m_yOffset;

BYTE* m_pData; // DIB颜色数据
BYTE* m_pMask; // 像素掩膜(0表示透明,1表示不透明,即有效)

int m_nAlpha; // 表示层的透明度
int m_nMode; // 模式
...
}

在图像需要显示的时候,把所有的层根据m_pMask、m_nAlpha、m_nMode进行内存运算并生成最终位图(DIB)即可。(只有当进行编辑操作后这个位图才需要改变)

注意,如果使用这种方法的话,所有的操作(包括画一条线)都必须自己实现,因为必须在修改数据的同时修改相应的遮罩。

2、魔术棒颜色选择必须根据遮罩来进行,实际跟Win32下的Rgn生成差不多。另外,相容性就是图像的颜色差异范围。比如红色是RGB(255, 0, 0),搜索时若允许10的偏差,则RGB(245, 0, 0)、RGB(255, 10, 0)等都应该是有效点。实际实现起来比较复杂。

liangzai 2001-02-11
  • 打赏
  • 举报
回复
<<visual c++开发GIS系统》陈建春,电子工业出版社,80。00元,或许能对你有所帮助
wxj_lake 2001-02-10
  • 打赏
  • 举报
回复
谁还有更可操作的建议,如果像stzhou(阿毛)说的用位图映射,那么进一步的问题是如何实现快速的魔术棒颜色选择?
wooingcn 2001-02-10
  • 打赏
  • 举报
回复
自己做个图层类,然后开一个数组或一个链表.在每个图层类上操作,显示的时候,再一个个显示,不过这个图层类的实现是有很大难度的.Good luck!
stzhou 2001-02-09
  • 打赏
  • 举报
回复
补充一点:不规则的,透明的图像用图像模板来实现,即每一层图像要有与之相对应的模板,以标志图像的显示区与于透明区域
例如:用1bit表示一个像素,0表示当前点透明,1表示需要显示
breath 2001-02-09
  • 打赏
  • 举报
回复
图层作成链表,不同图元联结到所在图层上
随风bj 2001-02-09
  • 打赏
  • 举报
回复
有意思,咱们也把 photoshot给开了!!
太复杂了,也不知道从何想起,有两点比较容易理解:1.调色板的控制 2.类似于数据库的内存操作算法

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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