我在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;
}
}
}
}
}
}
问题是没有进行擦除过渡
答案 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来更改图片框图像(在每个循环之间暂停,让人眼看到新图像)。