2017-05-04 8 views
-1

私は画像を処理するためにこのクラスを作ろうとしています。ビットマップフィールドと、他のメソッドがそのビットマップを使用できるように、ビットマップのパスに渡すコンストラクタが必要でした。だから私はこれを行うことが可能になりたかった: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を使用し、それを使用します。 – loneshark99

+0

このコードは、あなたが話しているエラーを生成しません。それはVSの不具合かもしれません。きれいにして再構築するか、VSを再起動してみてください。唯一のエラーは、あなたがgreyscale()への呼び出しを大文字にしていないことです。 – David

答えて

0

ImageProcessingクラスを使用するときに、常に正しいクラスを使用していることを確認するために、名前空間を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); 
    } 
} 
} 
関連する問題