两个简单的问题100分

king19840811 2008-12-31 09:19:16
trackbar 如何实现动态改变图片的透明度。。只需要告诉我怎样处理事件就行了。透明度的问题不要考虑。因为现在只能拖动一下trackbar
(必须等待事件处理完成后才能再次拖动,用的是scorll事件)就改变一下。我想实现动态的。有没有什么好方法啊

第二个问题:
如何实现锐化和马赛克效果。不要只贴代码上来。我想只知道他的原理。。

在此感谢
...全文
229 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
king19840811 2009-01-01
  • 打赏
  • 举报
回复
label1.Text = Convert.ToString(trackBar1.Value);
Color c;
int IWidth = pictureBox1.Image.Width;
int IHeight = pictureBox1.Image.Height;
Bitmap MyBmp = new Bitmap(pictureBox1.Image);
Bitmap bmp = new Bitmap(IWidth,IHeight);
for (int i = 0; i < IWidth - 1; i++)
{
for (int j = 0; j < IHeight - 1; j++)
{
c =MyBmp.GetPixel(i, j);
bmp.SetPixel(i, j,Color.FromArgb(trackBar1.Value,c.R,c.G,c.B));
}
}
pictureBox2.Image = bmp;

楼上可爱的各位前辈这是我在scroll事件中的代码?给我捉摸下怎样改?
net5i 2009-01-01
  • 打赏
  • 举报
回复
由于兄弟程序 耗时的操作,就是更新UI,所以使用多线程也是没用的

因为多线程也是要委托调用主线程进行UI刷新,这就会导致你的处理TrackBar控件的事件和更新UI都是主线程完成的,这跟全部由主线程来完成,效果是一样的。

所以关键是兄弟要优化你的绘图操作,我下面有个方法,图片在1024*768以内的情况下还是没有影响的:
private float m_fOpacity = 1.0f;
private Image m_image = 初始化图片;

//在绘图事件中调用该方法
private void DrawOpacityImage(Graphics g)
{
ImageAttributes imageAttributes = new ImageAttributes();

ColorMap colorMap = new ColorMap();

colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);

ColorMap[] remapTable = { colorMap };

imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);

float[][] colorMatrixElements = {
new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, this.m_fOpacity, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 0.1f}};
ColorMatrix wmColorMatrix = new ColorMatrix(colorMatrixElements);
imageAttributes.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

Rectangle imageBounds = new Rectangle(0, 0, this.m_image.Width, this.m_image.Height);
try
{
g.DrawImage(this.m_image, imageBounds, 0, 0, imageBounds.Width, imageBounds.Height, GraphicsUnit.Pixel, imageAttributes);
}
catch { }
}

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
this.m_fOpacity += 0.1f; //这里调整透明度
this.绘图控件.Invalidate();
}
数据之巅 2009-01-01
  • 打赏
  • 举报
回复
学习中。。。。。
killer_liqiao 2009-01-01
  • 打赏
  • 举报
回复
up
king19840811 2009-01-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 GTX280 的回复:]
引用 2 楼 king19840811 的回复:
trackbar的scorll事件就行了 ,不行啊。一拖他不就去调用事件了。再拖也拖不动了。要等事件处理完了才行啊。。透明遍历每个像素点的代码时间很长啊。。

考虑多线程处理,不要让UI线程阻塞
[/Quote]
怎样处理
biggates_86 2009-01-01
  • 打赏
  • 举报
回复
以我的理解,马赛克是把 NxN 的方块的颜色全部设置为该方块中的像素的平均值……

hangang7403 2009-01-01
  • 打赏
  • 举报
回复
UP
jivi 2009-01-01
  • 打赏
  • 举报
回复
锐化就是增强当前点和周围点的对比度,以让人感觉更清晰一点,实现的方法,就是把当前点的颜色分量值(R G B)分别加上 他周围点对应的颜色分量值的和的平均值乘一个 x. 这个x就是锐化度了。
也就是 点P(R G B) 周围为 P1-P8 八个点,最全的是八个点,如果是图象边缘的点达不到八个点。
那么如果要实现锐化 就要
P(R) = P(R) + (P1(R) + P2(R) ... P7(R) + P8(R))/8*x (x就是锐化度 0-1之间的值)
同样的处理 P(G) 和 P(B) 就行了。


柔化 的原理一样,只是将当前点的颜色分量值,直接变成 周围点+自己的颜色分量值的平均值就行了。
P(R) = (P(R)+ P1(R) + P2(R) ... P7(R) + P8(R))/9 (因为自己也算在内了)

至于马赛克不太清楚,我想 可能 就是 按马赛克的粒度,例如粒度是 4×4的块,那么随便取这一块内的一个颜色(取中间的效果最好),然后将这一块内的其它颜色全部变成这个点的颜色就可以了 。
kweszx 2009-01-01
  • 打赏
  • 举报
回复
帮你顶
real745839 2009-01-01
  • 打赏
  • 举报
回复
10楼的比较详细
king19840811 2009-01-01
  • 打赏
  • 举报
回复
没沉了。还待进一步解决
steden 2009-01-01
  • 打赏
  • 举报
回复
新年快乐
niitnanfeng 2008-12-31
  • 打赏
  • 举报
回复
帮你顶
GTX280 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 king19840811 的回复:]
trackbar的scorll事件就行了 ,不行啊。一拖他不就去调用事件了。再拖也拖不动了。要等事件处理完了才行啊。。透明遍历每个像素点的代码时间很长啊。。
[/Quote]
考虑多线程处理,不要让UI线程阻塞
king19840811 2008-12-31
  • 打赏
  • 举报
回复
我的意思是一边拖动trackbar。透明度也跟着变。其实跟开音量的意思差不多。
对月成双 2008-12-31
  • 打赏
  • 举报
回复
图片的每一点都是由一个小的像素组成,
将像素的顺序打乱且放大,模糊看上去有一个个的小格子组成,
容易实现一点的就是直接放大N倍,不用打乱顺序。
即形成马赛克。
51Crack 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 king19840811 的回复:]
trackbar的scorll事件就行了 ,不行啊。一拖他不就去调用事件了。再拖也拖不动了。要等事件处理完了才行啊。。透明遍历每个像素点的代码时间很长啊。。
[/Quote]
你想怎么样?!
执行时把trackbar禁用!
king19840811 2008-12-31
  • 打赏
  • 举报
回复
trackbar的scorll事件就行了 ,不行啊。一拖他不就去调用事件了。再拖也拖不动了。要等事件处理完了才行啊。。透明遍历每个像素点的代码时间很长啊。。
Fibona 2008-12-31
  • 打赏
  • 举报
回复
第一个问题就是响应trackbar的scorll事件就行了

锐化起源于天文摄影。拍天体星云什么的,常常很模糊,所以发展了这么一个暗房技术:
把底片印一张原大的低反差而模糊的反转正片,作为蒙片(叫做 unsharp mask),再叠在原底片来扩印,出来的效果是,物体边线左右,反差增强了,这样看起来,物体的边线便好像清晰了。


会出现马赛克的图片是位图。每个一细节都是由一个小的像素块组成的,如果将其无限放大,每个像素块就会很明显地表现出来,就是我们说的马赛克。

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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