private static voID DrawInvertedCrosshair(Graphics g,Image img,PointF location,float length,float wIDth){ float halfLength = length / 2f; float halfWIDth = wIDth / 2f; Rectangle absHorizRect = Rectangle.Round(new RectangleF(location.X - halfLength,location.Y - halfWIDth,length,wIDth)); Rectangle absvertRect = Rectangle.Round(new RectangleF(location.X - halfWIDth,location.Y - halfLength,wIDth,length)); ImageAttributes attributes = new ImageAttributes(); float[][] invertMatrix = { new float[] {-1,0 },new float[] { 0,-1,1,new float[] { 1,1 } }; colorMatrix matrix = new colorMatrix(invertMatrix); attributes.SetcolorMatrix(matrix,colorMatrixFlag.Default,colorAdjustType.Bitmap); g.DrawImage(img,absHorizRect,absHorizRect.X,absHorizRect.Y,absHorizRect.WIDth,absHorizRect.Height,GraphicsUnit.Pixel,attributes); g.DrawImage(img,absvertRect,absvertRect.X,absvertRect.Y,absvertRect.WIDth,absvertRect.Height,attributes);}
它按预期工作,但它真的很慢.我希望用户能够使用鼠标移动选定的位置,方法是在移动时将位置设置为光标的位置.不幸的是,在我的计算机上,对于大图像,它每秒只能更新一次.
所以,我正在寻找使用Graphics.DrawImage来反转图像区域的替代方法.有没有办法以与所选区域区域而不是整个图像区域成比例的速度执行此 *** 作?
解决方法 对我来说,你正在关注错误的问题.绘画图像很慢,不画“十字线”.当你没有帮助时,大图像肯定会非常昂贵.而System.Drawing让人很容易找不到帮助.你想要做的两件基本事情是让图像画得更快,速度提高20倍以上是可以实现的:
>避免强制图像绘制代码重新缩放图像.而是只做一次,这样可以直接一对一地绘制图像而无需任何重新缩放.这样做的最佳时间是加载图像.可能再次出现在控件的Resize事件处理程序中.
>注意图像的像素格式.远射中最快的是像素格式,它与图像需要存储在视频适配器中的方式直接兼容.因此,图像数据可以直接复制到视频RAM,而无需调整每个像素.在99%的现代机器上,这种格式是PixelFormat.Format32bppPArgb.产生巨大的差异,它比其他所有产品快十倍.
一个简单的辅助方法,可以在不处理宽高比的情况下完成两者:
private static Bitmap Resample(Image img,Size size) { var bmp = new Bitmap(size.WIDth,size.Height,System.Drawing.Imaging.PixelFormat.Format32bppPArgb); using (var gr = Graphics.FromImage(bmp)) { gr.DrawImage(img,new Rectangle(Point.Empty,size)); } return bmp;}总结
以上是内存溢出为你收集整理的c# – 用于大图像的Graphics.DrawImage替代品全部内容,希望文章能够帮你解决c# – 用于大图像的Graphics.DrawImage替代品所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)