2012-01-19 12 views
1

効率的な画像クラス...私はSystem.Drawing.Bitmapを取ると変換するために、ロック・ビットを使用する負荷が含まれますEfficientImageと呼ばれる自分のイメージクラスを作成したい実装私はデザインの質問を持っている

2Dバイト配列に変換します。

class EfficientImage 
{ 

    private byte[,] image; 
    private int width; 
    private int height; 

    public Load(System.Drawing.Bitmap inImage) 
    { 
    } 

    //etc... 

} 

ので、私は最初の場所でするLockBitsを使用してのパフォーマンス向上を失うことなく、オブジェクト内の画像アレイにアクセスするための最良の方法は何

EfficentImage ef = new EfficientImage(); 
ef.Load(myBitmap); 

を持っているのでしょうか?アクセサーやプロパティを持っているとGetPixel/SetPixelが正常ではないBitmapオブジェクトに複製され、イメージフィールドをpublicに設定するとカプセル化が中断されてしまうと思います。

このデザインは完全に間違った方法かもしれません行っても、私はより良い/正しい方法を学ぶことがとてもうれしいです。あなたの助け

+0

はただ好奇心、あなたがあなたの提案クラスで既存のイメージのクラスでどのような非効率性を解決している:)私はポイントを逃した

謝罪場合は?それともこれはちょうど学習の練習ですか? – Mikeb

+0

正直言って学習の練習の多くは、私は他の問題に学ぶことを適用することができます – TomP89

答えて

3

ため

おかげで私はあなたが画像にフィルタのいくつかの種類を適用するとし、または複数のピクセルを修正する処理のいくつかの他の種類を持っています。その場合は、私は、例えば、ImageFilterのようなもの、あなたのクラスを呼ぶだろう

public abstract class ImageFilter 
{ 
    protected abstract void ApplyFilter(byte[,] imageData); 

    public Bitmap Apply(Bitmap image) 
    { 
     // lockbits etc 
     ApplyFilter(imageData); 
     // unlockbits 
    } 
} 

public class MyFilter : ImageFilter 
{ 
    protected override ApplyFilter(byte[,] imageData) 
    { 
     // work on the bits 
    } 
} 

Bitmap newBitmap = new MyFilter().Apply(oldBitmap); 

あなたはImageFilter抽象クラスのお得な情報ながら、生データのみを扱うカスタムフィルタを作成することができますこの方法画像とそのデータを読み込みます。

+0

答えをありがとう、私は本当にこれが好きですが、私が持っている状況は、私はフォームクラスからImageオブジェクトを作成している私はImageベースクラスを継承することができません。その周りに何か考えてもらえますか? – TomP89

+0

'ImageFilter'を継承するフィルタ(' MyFilter'など)は、作成する新しいクラスです。 'Form'の中からこのようなフィルタの新しいインスタンスを作成し、それを' Image'に 'Apply()'することができます。あなたは出くわす。 –

+0

はい、申し訳ありません。ご協力いただきありがとうございます! – TomP89

関連する問題