C#位图类为字段?

问题描述:

我试图让这个类处理图像,我希望它有一个位图字段和一个构造函数,它允许我提供位图的路径,以便其他方法可以使用该位图。所以,我希望它能够做到这一点:C#位图类为字段?

ImageProcessing image = new ImageProcessing("D:\\image.bmp"); 
int time_of_processing = image.grayscale(); 
image.SaveTo("D:\\image2.bmp"); 

所以这是我的代码:

public class ImageProcessing 
{ 
    Bitmap image; 

    public ImageProcessing(string path) 
    { 
     image = new Bitmap(path); 
    } 

    public int Grayscale() 
    { 
     Stopwatch time = new Stopwatch(); 

     time.Start(); 
     for (int x = 0; x < image.Width; x++) 
     { 
      for (int y = 0; y < image.Height; y++) 
      { 
       Color pixelColor = image.GetPixel(x, y); 
       int grayScale = (int)((pixelColor.R * 0.21) + (pixelColor.G * 0.72) + (pixelColor.B * 0.07)); 
       Color newColor = Color.FromArgb(grayScale, grayScale, grayScale); 
       image.SetPixel(x, y, newColor); 
      } 
     } 
     time.Stop(); 
     TimeSpan ts = time.Elapsed; 
     int milliseconds = ts.Milliseconds + (ts.Seconds * 1000); 

     return milliseconds; 

    } 

    public void SaveTo(string path) 
    { 
     image.Save(path); 
    } 
} 

当我有这个,Visual Studio中告诉我,图像将始终为NULL。构造函数应该如何查找它的工作?

+2

对于初学者,表明实际产生你所谈论的......错误消息的实际代码;) – elgonzo

+3

既然你有位图作为你应该收集垃圾的申请中的一个,我会建议实施在ImageProcessing类上使用Idisposable并在其周围使用Use。 – loneshark99

+0

此代码不会产生您正在谈论的错误。这可能是VS中的一个小故障。尝试做一个干净的重建,或重新启动VS?唯一的错误是,你还没有大写调用灰度() – David

当您使用它来确保它始终使用正确的类时,将名称空间添加到ImageProcessing类。下面的代码(主要是原始代码)已经过测试和工作(它会对列出的图像进行灰度化)。

namespace WindowsFormsApplication10 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     string path1 = @"C:\work\test.bmp"; 
     string path2 = @"C:\work\test2.bmp"; 
     WindowsFormsApplication10.ImageProcessing image = new WindowsFormsApplication10.ImageProcessing(path1); 
     int time_of_processing = image.Grayscale(); 
     image.SaveTo(path2); 

    } 
} 

public class ImageProcessing 
{ 
    Bitmap image; 

    public ImageProcessing(string path) 
    { 
     image = new Bitmap(path); 
    } 

    public int Grayscale() 
    { 
     Stopwatch time = new Stopwatch(); 

     time.Start(); 
     for (int x = 0; x < image.Width; x++) 
     { 
      for (int y = 0; y < image.Height; y++) 
      { 
       Color pixelColor = image.GetPixel(x, y); 
       int grayScale = (int)((pixelColor.R * 0.21) + (pixelColor.G * 0.72) + (pixelColor.B * 0.07)); 
       Color newColor = Color.FromArgb(grayScale, grayScale, grayScale); 
       image.SetPixel(x, y, newColor); 
      } 
     } 
     time.Stop(); 
     TimeSpan ts = time.Elapsed; 
     int milliseconds = ts.Milliseconds + (ts.Seconds * 1000); 
     return milliseconds; 

    } 

    public void SaveTo(string path) 
    { 
     image.Save(path); 
    } 
} 
}