2012-07-11 42 views
0

我在C# 被开发Windows应用程序,在C#转换这个程序有三个按钮(打开,保存,灰度) 并具有图片框在应用插入图像,灰度和擦拭

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

要进行灰度化图像考虑使用这个更好的解决方案

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的图像在一个循环,但同时在这个循环中它没有有时间更新图形用户界面,所以picturebox被有效地改变,只有退出循环..所以你没有看到过渡。
您应该使用BackgroundWorker更改picturebox图像(在每个循环之间暂停,以便让人眼看到新图像)。

+0

不,我没有意味着灰度,因为它与我的代码工作我的意思是第三个循环包含擦拭过渡它应该工作,但我不知道是问题 – 2012-07-11 07:57:04

+0

没有人所有的代码是与我合作 我只想要第三个循环的正确语法 – 2012-07-11 08:02:06

+0

@ OmarAl-hamawi:阅读我编辑的答案。无论如何,你的代码是错误的,所以看看它。我的灰度代码更高效。您的保存例程具有两次bmp,并且不使用正确的路径功能来获取文件扩展名。 :) – Marco 2012-07-11 08:06:05