C# - Winforms绘制位图

Rom*_*yan 0 c# user-controls drawing winforms visual-studio-2013

我遇到了这样的问题.我正在制作一个小型照片编辑器,您可以在其中选择图像,更改图像的亮度对比度,在图像上绘制文本.这是表格. 在此输入图像描述.我有这个方法.

private void DrawText(string text, int x, int y)
    {
        RectangleF rectf = new RectangleF(x, y, 90, 50);
        Graphics g = Graphics.FromImage(this.pictureBox1.Image);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.DrawString(text.ToString(), new Font("Tahoma", Convert.ToInt32(this.textBoxSize.Text.ToString())), Brushes.Black, rectf);
        g.Flush();
    }

private void SetBrightness(int brightness)
    {
        if (!object.ReferenceEquals(this.pictureBox1.Image, null))
        {
            Bitmap temp = (Bitmap)this.pictureBox1.Image;
            Bitmap bmap = (Bitmap)temp.Clone();
            if (brightness < -255) brightness = -255;
            if (brightness > 255) brightness = 255;
            Color c;
            for (int i = 0; i < bmap.Width; i++)
            {
                for (int j = 0; j < bmap.Height; j++)
                {
                    c = bmap.GetPixel(i, j);
                    int cR = c.R + brightness;
                    int cG = c.G + brightness;
                    int cB = c.B + brightness;

                    if (cR < 0) cR = 1;
                    if (cR > 255) cR = 255;

                    if (cG < 0) cG = 1;
                    if (cG > 255) cG = 255;

                    if (cB < 0) cB = 1;
                    if (cB > 255) cB = 255;

                    bmap.SetPixel(i, j,
        Color.FromArgb((byte)cR, (byte)cG, (byte)cB));
                }
            }
            this.pictureBox1.Image = (Bitmap)bmap.Clone();
        }
    }

public void SetContrast(double contrast)
    {
        if (!object.ReferenceEquals(this.pictureBox1.Image, null))
        {
            Bitmap temp = (Bitmap)this.pictureBox1.Image;
            Bitmap bmap = (Bitmap)temp.Clone();
            if (contrast < -100) contrast = -100;
            if (contrast > 100) contrast = 100;
            contrast = (100.0 + contrast) / 100.0;
            contrast *= contrast;
            Color c;
            for (int i = 0; i < bmap.Width; i++)
            {
                for (int j = 0; j < bmap.Height; j++)
                {
                    c = bmap.GetPixel(i, j);
                    double pR = c.R / 255.0;
                    pR -= 0.5;
                    pR *= contrast;
                    pR += 0.5;
                    pR *= 255;
                    if (pR < 0) pR = 0;
                    if (pR > 255) pR = 255;

                    double pG = c.G / 255.0;
                    pG -= 0.5;
                    pG *= contrast;
                    pG += 0.5;
                    pG *= 255;
                    if (pG < 0) pG = 0;
                    if (pG > 255) pG = 255;

                    double pB = c.B / 255.0;
                    pB -= 0.5;
                    pB *= contrast;
                    pB += 0.5;
                    pB *= 255;
                    if (pB < 0) pB = 0;
                    if (pB > 255) pB = 255;

                    bmap.SetPixel(i, j,
        Color.FromArgb((byte)pR, (byte)pG, (byte)pB));
                }
            }
            this.pictureBox1.Image = (Bitmap)bmap.Clone();
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我的按钮CLick上,我只是调用这些方法来完成工作.当我第二次绘制文本时,问题不在于删除和再次绘制文本,但我需要每次都在不同的位置绘制文本而不是旧文本.你能建议任何解决方案吗?谢谢

Ern*_*rno 5

有两种解决方案:

  1. 不要在位图上绘图; 而是在一个位于其上的不可见位图上绘制.

  2. 保留原始位图并在绘制之前复制它.

更改位图的像素后,除非保留原始数据,否则无法撤消该位图.