图片放大、缩小的超级难题,请各位朋友支招啊!快疯了!!!!

wwwafa9 2011-01-19 10:20:06
想实现WinXP自带的 “Windows 图片和传真查看器”类似的放大、缩小功能。

我的实现逻辑如下:(WinForm形式)
1、用一个panel和一个PictureBox来组合显示图片,Panel的AutoScroll属性设为true;
2、第一次显示图片的时候:
如果图片的宽度或高度大于Panel的宽度或高度,则PictureBox的宽度和高度等于Panel的宽度和高度,PictureBox的SizeMode设为Zoom;
否则,PictureBox的宽度和高度等于图片的宽度和高度,PictureBox的SizeMode设为AutoSize,PictureBox在Panel中居中显示。
3、放大、缩小功能:
(1)设置3个数值:最大放大倍数(总为为5,表示只能放大5倍);缩放次数(默认为0);缩放因子(总为1.1);
(2)放大的时候,PictureBox的宽度和高度分别乘以缩放因子,缩放次数递增,当等于最大放大倍数的时候,停止放大;
(3)缩小的时候,PictureBox的宽度和高度分别除以缩放因子,缩放次数递减,当等于0的时候,停止缩小;
(4)每次都要使PictureBox居中显示,如果Panel出现了滚动条,则Panel的滚动条滚动到中间位置。

出现如下问题:
1、当放大、缩小的时候,屏幕会闪烁;
2、当显示大图片的时候,屏幕闪烁得厉害;
3、当出现滚动条的时候,屏幕闪烁得厉害。

怎么做才能减少屏幕闪烁或避免屏幕闪烁?请各位朋友给出出主意,非常感谢大家!!
...全文
767 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwafa9 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 viena 的回复:]

引用 51 楼 wwwafa9 的回复:
引用 50 楼 allanbolt 的回复:

在后台dc里面画好图像 然后用API BitBlt拷贝到你的界面上


这么高深,不知道怎么做。


看来LZ对GDI完全不了解啊,呵呵~~
[/Quote]

很少做这个。见笑了。
viena 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 wwwafa9 的回复:]
引用 50 楼 allanbolt 的回复:

在后台dc里面画好图像 然后用API BitBlt拷贝到你的界面上


这么高深,不知道怎么做。
[/Quote]

看来LZ对GDI完全不了解啊,呵呵~~
wwwafa9 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 allanbolt 的回复:]

在后台dc里面画好图像 然后用API BitBlt拷贝到你的界面上
[/Quote]

这么高深,不知道怎么做。
不老神仙 2011-01-24
  • 打赏
  • 举报
回复
在后台dc里面画好图像 然后用API BitBlt拷贝到你的界面上
wwwafa9 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 madaming 的回复:]

引用 42 楼 wwwafa9 的回复:
期待高人出现!

难道你没有看懂这段代码吗?在详细写一下
graphics g=e.graphics;

double delta=0.5;//缩放因子
image img=你的图像;
g.drawimage(img,with*delta,height*delta);
[/Quote]

兄弟,你的这段代码想要做什么?实现放大、缩小功能后界面不会闪烁?
我的要求是图片始终居中显示,Panel的滚动条也要滚动到中间(不管是垂直的还是水平的,如果有的话)
wwwafa9 2011-01-24
  • 打赏
  • 举报
回复
高手不要在一旁看笑话啊!

给出出主意啊!
mrpmc 2011-01-22
  • 打赏
  • 举报
回复
用pictureBox
mrpmc 2011-01-22
  • 打赏
  • 举报
回复
//放大图片
private void button1_Click(object sender, EventArgs e)
{
if (x < 1437.75 || y < 2122.875)//宽度最大值为1437.75,高度最大值为2122.875
{
//this.pictureBox1.Width = x * 2;
//this.pictureBox1.Height = y * 2;
//x = x * 2;
//y = y * 2;
this.pictureBox1.Width = (int)(x * 1.5);
this.pictureBox1.Height = (int)(y * 1.5);
x = x * 1.5;
y = y * 1.5;
//MessageBox.Show(x.ToString(), y.ToString());
}
else
{

}
}
//缩小图片
private void button2_Click(object sender, EventArgs e)
{
if (x > x2 || y > y2)//宽度最小值为426,高度最小值为629
{
this.pictureBox1.Width = (int)(x / 1.5);
this.pictureBox1.Height = (int)(y / 1.5);
x = x / 1.5;
y = y / 1.5;
//MessageBox.Show(x.ToString(), y.ToString());
}
else
{
}
}
wwwafa9 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 yuwenge 的回复:]

引用 36 楼 jointan 的回复:

你应该用代码去修改后台的源.如果你指望前台来实现,没有可操作性.用.Net提供的部分功能,去解决图形显示方面的性能问题,基本没有出路,双缓存是解决自绘的

他就是要解决自绘闪烁。
[/Quote]

知心人啊!非常感动。。。
卧_槽 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 jointan 的回复:]

你应该用代码去修改后台的源.如果你指望前台来实现,没有可操作性.用.Net提供的部分功能,去解决图形显示方面的性能问题,基本没有出路,双缓存是解决自绘的
[/Quote]
他就是要解决自绘闪烁。

wwwafa9 2011-01-21
  • 打赏
  • 举报
回复
各位朋友积极一点啊!问题很严重!!!!
海涵德 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 wwwafa9 的回复:]
期待高人出现!
[/Quote]
难道你没有看懂这段代码吗?在详细写一下
graphics g=e.graphics;

double delta=0.5;//缩放因子
image img=你的图像;
g.drawimage(img,with*delta,height*delta);


wwwafa9 2011-01-21
  • 打赏
  • 举报
回复
谢谢各位朋友的热情回复。看来这个问题确实不简单啊。
wwwafa9 2011-01-21
  • 打赏
  • 举报
回复
期待高人出现!
jointan 2011-01-21
  • 打赏
  • 举报
回复
你应该用代码去修改后台的源.如果你指望前台来实现,没有可操作性.用.Net提供的部分功能,去解决图形显示方面的性能问题,基本没有出路,双缓存是解决自绘的
jointan 2011-01-21
  • 打赏
  • 举报
回复
什么都不管用,.Net不适合做这种事
wwwafa9 2011-01-20
  • 打赏
  • 举报
回复
这个问题怎么这么难啊?太麻烦了!
babyblueii 2011-01-20
  • 打赏
  • 举报
回复
用gdi+自己画吧
http://www.cnblogs.com/stg609/archive/2008/03/16/1108333.html
wwwafa9 2011-01-20
  • 打赏
  • 举报
回复
请先看清我的说明再回答问题,谢谢各位了!
cmapler 2011-01-20
  • 打赏
  • 举报
回复
使用双缓冲
加载更多回复(29)

110,476

社区成员

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

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

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