gpt4 book ai didi

c# - 用于大图像的 Graphics.DrawImage 替代品

转载 作者:行者123 更新时间:2023-11-30 14:12:21 25 4
gpt4 key购买 nike

我正在尝试在图像上绘制一个带有反转颜色的十字准线(“加号”),以显示图像中选定点的位置。我是这样做的:

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, 0, 0, 0 },
new float[] { 0, -1, 0, 0, 0 },
new float[] { 0, 0, -1, 0, 0 },
new float[] { 0, 0, 0, 1, 0 },
new float[] { 1, 1, 1, 0, 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, GraphicsUnit.Pixel, 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 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17873337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com