像素的替换问题

beandog 2005-05-27 06:56:23
我在picture里加载一张图片,需要透明的地方用粉红色代替,颜色码是FF00FF,请问怎样让这些地方的像素颜色和from上对应的像素颜色相同?我写了一段代码,可是过不去,请大家帮忙看看
For i = picture.Top To pictureTop + picture.Height - 1
For j = picture.Left To picture.Left + picture.Width - 1
DoEvents
If GetPixel(picture.hdc, j, i) = 11759697 Then
BitBlt picture.hdc, j, i, 1, 1, Me.hdc, j, i, vbSrcCopy
End If
Next
Next
...全文
135 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
beandog 2005-06-01
  • 打赏
  • 举报
回复
谢谢小吉:)
homezj 2005-05-30
  • 打赏
  • 举报
回复
不是我没明白你意思,而是你的用法说明你还不理解它是怎么用的。

看看我前面是怎么写的:
------------------------
TransparentBlt me.hdc, 0, 0, picture1.ScaleWidth, picture1.ScaleHeight, picture1.hdc, 0, 0, picture1.ScaleWidth, picture1.ScaleHeight, &HFF00FF

这是把picture1中的位图扣去&HFF00FF色透明绘入Form中。
------------------------

目标是form;
picture1中是带ff00ff色背景的原图。

你那一改,成什么了?

还有一点:很多初学者(包括一些大侠级人物),对Width与ScaleWidth不分!非常要命呀!已无心过多评论!
beandog 2005-05-30
  • 打赏
  • 举报
回复
马甲,你写的那段代码有些问题,
setpixel(picture.hdc,j,i,aa)
这一句是不是不应该加括号?
beandog 2005-05-30
  • 打赏
  • 举报
回复
小吉你给的那段代码还是不行哦
握这样改了一下
TransparentBlt picture1.hdc, 0, 0, picture1Width, picture1Height, Me.hdc, 0, 0, Me.Width, Me.Height, &HFF00FF
好像也不行
小吉你可能没明白我的意思,我是想把picture里的ff00ff色扣掉,让其显示成from上对应处的颜色,我看了一下TransparentBlt说明,的一个参数好像应该是目标的hdc,麻烦帮我看看是不是还有什么问题》?
DooDu 2005-05-28
  • 打赏
  • 举报
回复
autoredraw用于持久图形的,

msdn:
持久图形:
当特定类型的屏幕事件发生时,例如,窗体被隐藏到另一窗口之后的重新显示,持久图形将自动被保存。当 AutoRedraw 属性被设置为 True 时所绘制的图形是持久的。

就是说,用autoredraw能使屏幕在变动的时候能进行自动绘制原图。你可以试试,先在 picturebox放个图片,然后最小化你的窗体,再还原,如果autoredraw=false,你的图片没了,如果让它为true,你的图片没什么变化。


如果是单纯颜色替换,还是用那个api方便些,如果还有其他的图象处理操作,那就用GetBitmapBits与SetBitmapBits,网上有封装好的类。
homezj 2005-05-28
  • 打赏
  • 举报
回复
呵呵,收集资料是我的弱项,我常是在网上到处看看,理解后也就忘了原出处。你看看别的朋友能不能提供吧。
VB在很多人眼里就是一个COM的外壳,其图形系统也不例外,很多都是将GDI函数进行了便于使用的变换或VB概念化的封装。
但正是由于VB对使用者“无微不至”的关怀,当VB图形与GDI混用时,常会从概念上带来一些混乱。

关于autoredraw,MSDN中有说明,不过那是针对VB内部的,涉及API时,你可将autoredraw看成是一个“开关”,当其为False时,Hdc指向前台的可视客户区,当其为True时,Hdc指向后台不可见的内存位图(客户区镜像)。而hdc指向谁,关系到所有的API调用将在哪里发生作用,至关重要啊!

更多内容,实在很难几句话说清,具体问题再具体分析吧!
beandog 2005-05-28
  • 打赏
  • 举报
回复
谢谢小吉了~
你知道那里有图形系统的资料吗?
另外这个autoredraw属性不太明白,它有什么影响?
homezj 2005-05-28
  • 打赏
  • 举报
回复
这段时间忙着装修新房子,很少有空,昨天只是在论坛路过而已,实在没心思细写回复,还望谅解!

bitblt不是慢(它可以说是GDI中最快的绘图函数了),而是你的用法不对,bitblt中文译名叫“位块传输”,不是点传输!你把点传输用块函数去处理,有些“乱兴土木”了^_^

TransparentBlt是一个标准API,98及以上系统都可使用。只是要注意,在Win98下,这个函数存在内存泄露现象,不建议多次使用(最好别用)。
根据你的问题,用法如下:
Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long

TransparentBlt me.hdc, 0, 0, picture1.ScaleWidth, picture1.ScaleHeight, picture1.hdc, 0, 0, picture1.ScaleWidth, picture1.ScaleHeight, &HFF00FF

这是把picture1中的位图扣去&HFF00FF色透明绘入Form中。

不管哪种方法,你都需先熟悉VB图形系统,两个hdc的本质,及ScaleMode、AutoRedraw属性的运用也会对结果产生影响。
beandog 2005-05-27
  • 打赏
  • 举报
回复
麻烦能不能给个例子,谢谢了

其实这里对速度的要求不是很高,用bitblt也是可以的
DooDu 2005-05-27
  • 打赏
  • 举报
回复
的确,setpixel和getpixel是比较慢,但最起码比pset快点~~
综合楼主的水平,用GetBitmapBits与SetBitmapBits就比较复杂点了。

homezj(小吉)能讲下TransparentBlt是干什么用的么?
homezj 2005-05-27
  • 打赏
  • 举报
回复
GetPixel与setpixel不是为干这种事设计的,超级慢!
两个方案:
1、用TransparentBlt一次绘制,比你的办法可快万倍以上
2、用GetBitmapBits与SetBitmapBits取DDB位图数组处理,比你的办法可快千倍以上
DooDu 2005-05-27
  • 打赏
  • 举报
回复
dim aa as long
aa=getpixel(me.hdc,1,1)

For i = 0 To picture.Height - 1
For j = 0 To picture.Width - 1
DoEvents
If GetPixel(picture.hdc, j, i) = 11759697 Then
setpixel(picture.hdc,j,i,aa)
End If
Next
Next

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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