如何在滚动较大的缩小图片时防止图形卡顿
我有一个很大的tiff图片(5.9 Mb,13k X 16k reolution),用户可以将其加载到一个可滚动的面板中,然后他可以放大/缩小,滚动和标记点,区域等。
对于可滚动的双缓冲面板我正在使用鲍勃鲍威尔的真棒ZoomPicBox的修改该面板仅显示当前视图中的部分图片。
缩小时滚动图像时出现断断续续的情况(即使interpolationMode设置为低)
有什么可以做的(最好没有硬件加速)?
面板的绘画事件:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { if (_image == null) { base.OnPaintBackground(e); return; } //scale System.Drawing.Drawing2D.Matrix ScaleMat = new System.Drawing.Drawing2D.Matrix(_zoom, 0, 0, _zoom, 0, 0); //move to position of scrollbas ScaleMat.Translate(this.AutoScrollPosition.X / (_zoom), this.AutoScrollPosition.Y / (_zoom)); e.Graphics.Transform = ScaleMat; e.Graphics.InterpolationMode = _interpolationMode; e.Graphics.DrawImage(_image, new Rectangle(0, 0, _image.Width, _image.Height), 0, 0, _image.Width, _image.Height, GraphicsUnit.Pixel); base.OnPaint(e); }
构造函数:
public PicBoxPlus() { MouseMove += PicBoxPlus_MouseMove; KeyDown += PicBoxPlus_KeyDown; this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true); this.AutoScroll = true; }
编辑:尝试缓存
我尝试实现了Sinatr的代码,但是出了点问题,因为我得到的只是一个黑色图像(大小合适)。 任何人都知道可能出错了什么?
新的油漆事件:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { if (mCachedImage == null) { base.OnPaintBackground(e); return; } //scale System.Drawing.Drawing2D.Matrix ScaleMat = new System.Drawing.Drawing2D.Matrix(mZoom, 0, 0, mZoom, 0, 0); //move to position of scrollbas ScaleMat.Translate(this.AutoScrollPosition.X / (mZoom), this.AutoScrollPosition.Y / (mZoom)); try { if (mCachedImage == null) { mCachedImage = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); using (var cacheGraphics = Graphics.FromImage(mCachedImage)) { cacheGraphics.Transform = ScaleMat; cacheGraphics.InterpolationMode = _interpolationMode; cacheGraphics.DrawImage(mCachedImage, new Rectangle(0, 0, mCachedImage.Width, mCachedImage.Height), 0, 0, mCachedImage.Width, mCachedImage.Height, GraphicsUnit.Pixel); } e.Graphics.DrawImage(mCachedImage, Point.Empty); } } catch (Exception ex) { throw ex; } base.OnPaint(e); }
图像和缩放属性:
public Bitmap Image { get { return mCachedImage; } set { mCachedImage = value; UpdateScaleFactor(); this.Invalidate(); } } public Single Zoom { get { return mZoom; } set { if (value <= 0||value < 0.001) { value = 0.001f; } mZoom = value; UpdateScaleFactor(); ResetCache(); // Sinatr's function this.Invalidate(); } }
从主窗体加载图像:
panelMap.Image = (Bitmap)Image.FromFile("pic.tiff");
没有经过测试,但应该给出一个想法。
Bitmap _cached = null; override void OnPaint(PaintEventArgs e) { if(_cached == null) { _cached = new Bitmap(this.ClientSize.Width, this.ClientSize.Height); using(var graphics = Graphics.FromImage(_cached) { // draw into this graphics once -> it will be cached in _cached bitmap } } e.Graphics.DrawImage(_cached, Point.Empty); } // call this if _zoom or ClientSize is changed void ResetCache() { _cache = null; this.Invalidate(); // mandatory for _zoom change }
此外,我不知道如何呈现放大的图片,但通常会有一个偏移,以便您可以移动(平移)图像。
上述就是C#学习教程:如何在滚动较大的缩小图片时防止图形卡顿分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/958354.html