如何加快这些图形功能?

时间:2017-08-07 13:45:27

标签: c# winforms drawing

以下是我在我的应用程序中使用的几种方法

这个'突出显示'选择了一个区域(在MouseMove事件中调用,因此它经常被用来实时显示您选择的内容)。

忽略缩放变量,这样如果图像已调整大小以适合控件,则所选区域会被正确反映

private Bitmap DrawCropArea(Bitmap bm, Rectangle area)
{
    int x = (int)Math.Round(area.X / scaling);
    int y = (int)Math.Round(area.Y / scaling);
    int cropWidth = (int)Math.Round(area.Width / scaling);
    int cropHeight = (int)Math.Round(area.Height / scaling);

    using (Graphics gr = Graphics.FromImage(bm))
    {
        Brush brush = new Pen(Color.FromArgb(200, Color.DarkGray)).Brush;

        Rectangle rect1 = new Rectangle(0, 0, bm.Width, y);
        Rectangle rect2 = new Rectangle(0, y, x, cropHeight);
        Rectangle rect3 = new Rectangle(0, (y + cropHeight), bm.Width, bm.Height);
        Rectangle rect4 = new Rectangle((x + cropWidth), y, (bm.Width - x - cropWidth), cropHeight);

        gr.FillRectangle(brush, rect1);
        gr.FillRectangle(brush, rect2);
        gr.FillRectangle(brush, rect3);
        gr.FillRectangle(brush, rect4);
    }

    return bm;
}

这可以设置亮度和对比度,就像以前的方法一样,它经常在2轨道栏上调用EditValueChanging事件

private Bitmap ChangeBrightnessContrast(Bitmap bm, float cont, int bright)
{
    float[][] arr =
    {
        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[] { 0, 0, 0, 0, 1 },
    };

    ColorMatrix cMatrix = new ColorMatrix(arr);
    cMatrix.Matrix00 = cMatrix.Matrix11 = cMatrix.Matrix22 = cont;
    cMatrix.Matrix40 = cMatrix.Matrix41 = cMatrix.Matrix42 = bright / 255.0F;

    ImageAttributes imgAttributes = new ImageAttributes();
    imgAttributes.ClearColorMatrix();
    imgAttributes.SetColorMatrix(cMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    //imgAttributes.SetGamma(1.0F, ColorAdjustType.Bitmap);

    using (Graphics gr = Graphics.FromImage(bm))
    {
        gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
        gr.DrawImage(bm, new Rectangle(0, 0, bm.Width, bm.Height), 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel, imgAttributes);
    }

    return bm;
}

它很好,直到我在一些较大的图像上使用它们,它开始真正滞后。

我一直在阅读很多混合信息; GDI +确实支持硬件加速,不,你不应该使用Direct2D等。所以我不确定我能用我当前使用的绘图库改变一些东西,如果我应该切换到别的东西,或者我应该做很多腿部工作并将图像转换成较低分辨率的缩略图,然后在用户满意后重新应用所有调整到全尺寸图像?

0 个答案:

没有答案