在c#中插入图像,灰度和擦除过渡

时间:2012-07-11 07:39:49

标签: c# windows

我在c#中开发了一个windows应用程序 这个程序有三个按钮(打开,保存,灰度) 并有图片框在应用程序中显示图片

  using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace MyFirstWindowsApplication
{
    public partial class Form1 : Form
    {
        Bitmap newbitmap;
        Bitmap newbitmap2;
        Bitmap outp;
        Image file;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult dr = openFileDialog1.ShowDialog();

            if (dr == DialogResult.OK)
            {
                file = Image.FromFile(openFileDialog1.FileName);
                newbitmap = new Bitmap(openFileDialog1.FileName);
                newbitmap2 = new Bitmap(openFileDialog1.FileName);
                outp = new Bitmap(openFileDialog1.FileName);
                pictureBox1.Image = file;
            }
        }


        private void button2_Click(object sender, EventArgs e)
        {
            DialogResult dr = saveFileDialog1.ShowDialog();
            if (dr == DialogResult.OK)
            {
                if (newbitmap != null)
                {
                    if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "bmp")
                    {
                        newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                    }

                    if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "jpg")
                    {
                        newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp);
                    }

                    if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "bmp")
                    {
                        newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Jpeg);
                    }

                    if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 4).ToLower() == "jpeg")
                    {
                        newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Jpeg);
                    }

                    if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "png")
                    {
                        newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Png);
                    }

                    if (saveFileDialog1.FileName.Substring(saveFileDialog1.FileName.Length - 3).ToLower() == "gif")
                    {
                        newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Gif);
                    }
                }
                else
                {
                    MessageBox.Show("you need to open file first");
                }
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {


            for (int x = 0; x < newbitmap.Width; x++)
            {
                for (int y = 0; y < newbitmap.Height; y++)
                {
                    Color originalColor = newbitmap.GetPixel(x, y);
                    int grayscale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));
                    Color newColor = Color.FromArgb(grayscale, grayscale, grayscale);
                    newbitmap.SetPixel(x, y, newColor);
                }

            }

            int tmax = 10;
            int xmax=newbitmap.Width;
            int ymax=newbitmap.Height;
            for (int t = 0; t <= tmax; t += 1)
            {

                for (int x = 0; x < xmax; x++)
                {
                    for (int y = 0; y < ymax; y++)
                    {
                        if ((x / xmax) > (t / tmax))
                        {
                            Color originalco = newbitmap2.GetPixel(x, y);
                            outp.SetPixel(x, y, originalco);
                        }
                        else
                        {
                            Color originalco3 = newbitmap.GetPixel(x, y); ;
                            outp.SetPixel(x, y, originalco3);
                        }
                        pictureBox1.Image = outp;
                    }


                }
            }



        }
    }
}

问题是没有进行擦除过渡

1 个答案:

答案 0 :(得分:1)

要制作灰度图像,请考虑使用此更好的解决方案

public Image MakeGrayscale(Image original)
{
    Image newBitmap = new Bitmap(original.Width, original.Height);
    Graphics g = Graphics.FromImage(newBitmap);
    ColorMatrix colorMatrix = new ColorMatrix(
       new float[][] 
        {
            new float[] {0.299f, 0.299f, 0.299f, 0, 0},
            new float[] {0.587f, 0.587f, 0.587f, 0, 0},
            new float[] {.114f, .114f, .114f, 0, 0},
            new float[] {0, 0, 0, 1, 0},
            new float[] {0, 0, 0, 0, 1}
        });

    ImageAttributes attributes = new ImageAttributes();
    attributes.SetColorMatrix(colorMatrix);
    g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
       0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);

    g.Dispose();
    return newBitmap;
}

然后

pictureBox1.Image = MakeGrayscale(newbitmap);

即使在保存例程中也有一些错误。试试这个:

private void button2_Click(object sender, EventArgs e)
{
    if (newbitmap == null)
    {
        MessageBox.Show("you need to open file first");
        return;
    }

    if (DialogResult dr = saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string ext = Path.GetExtension(saveFileDialog1.FileName).ToLower();
        switch (ext)
        {
            case ".bmp": 
                newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Bmp); 
                break;
            case ".jpg": 
            case ".jpeg": 
                newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Jpeg); 
                break;
            case ".png": 
                newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Png); 
                break;
            case ".gif": 
                newbitmap.Save(saveFileDialog1.FileName, ImageFormat.Gif); 
                break;
            default: MessageBox.Show("Extension not supported");
        }
    }
}

在我看来,由于这个原因,转换不起作用:你的主线程(GUI一个要理解)在一个循环中快速(非常快)地改变了picturebox图像,但是在这个循环中它没有时间更新GUI,所以picturebox只有退出循环才能有效地改变..所以你看不到过渡 您应该使用BackgroundWorker来更改图片框图像(在每个循环之间暂停,让人眼看到新图像)。