一取反色画图的问题 (50分)

  • 主题发起人 主题发起人 草在墙头
  • 开始时间 开始时间

草在墙头

Unregistered / Unconfirmed
GUEST, unregistred user!
比如说我在(0,0,100,100)这个区域内画了一个颜色是red的Rectangle,现想用一反色将red区域冲掉。
该怎么做?
 
R:= GetRValue(color);
G:= GetGValue(color);
B:= GetBValue(color);
NewColor:= ColorToRGB(not R, not G, not B);
 
to 太阳火:
我可以将反色取出,但是我执行之后并没有将原来的rect取消,而是将red替换成了反色!
我要做的操作是将rect取消!该怎么做呢?
 
那要知道原来是什么颜色才行.
 
to 太阳火:
我不知你说的是什么意思,既然是颜色,那它肯定有值了,那也就是说知道它是什么颜色了,可以这么说吗?
 
你的意思是不是说,假设原来是黄色,加了个红色的矩形,现在想擦掉他,也就是再画一个
黄色的矩形覆盖它.可是如果你不知道原来是黄色,不就不行了吗.所以要先记录原来是
什么颜色.
 
我明白你的意思了,你只得是若背景是黄色,rect是红色,想要取消rect,就在原rect位置再画一黄色的rect,是吗?
但这肯定不行的,因为如果背景是一张图片呢?
 
你既然已经把一个区域图成一种纯色了,除非你做了备份,否则怎么能够回复呢?
如果用反色去冲(RGB值相加)的话,得到的应该是白色
 
我画的只是一个矩形,怎么做备份呢?我实在不会,讨教!
 
各位大侠,在图形操作过程中你们没有碰到类似的问题吗??还是不肯指教呢?
继续等待!
 
我想用个bitmap在画红色矩形前保存(也就是用draw)那个区域的内容,恢复时在重新draw上去
这个办法很笨的
 
您的意思是说在确定划下红色rect之前,先将这个矩形区域的象素保存下来,在需要的时候再将这些象素划到矩形区域。是吧?
呢这样做未必不是个方法,但是这种方法对于我而言由于种种原因行不同。
 
你是不是在做undo, redo之类的功能?
很多图像软件对于不可逆的操作的undo都是通过事先备份然后重新读取来实现的
 
难道就没有其他的方法了吗?
 
注意因为你把某个区域的颜色变为红色,这个红色是独立于原来的颜色的,和原来的颜色没有
任何关系,所以说是不可逆操作(也就是无法用算法重新计算颜色).
 
我不知道那样做对速度有多大的影响,因为如果我选择1024*768的区域,我就需要一个很大的数组和1024×768次循环啊!
 
不需要数组和循环呀呀,用TBitmap,
例如
MyBmp.width := 100;
MyBmp.height := 100;
MyBmp.canvas.draw(.....)
TCanvas的draw方法的语法
procedure Draw(X, Y: Integer;
Graphic: TGraphic);
 
对于delphi来说可以,但我现在用的是C#,其中没有提供这个方法(也可能是我没有找到吧),我再来看看!
谢谢你!
明天给分!!
 
接受答案了.
 
后退
顶部