2

C# の質問 (.net 3.5)。フィールド ushort[,] ピクセルを持つクラス ImageData があります。独自の画像形式を扱っています。ImageData クラスは、コンストラクターでファイルの場所を取得し、ファイル拡張子をオンにしてデコード方法を決定します。一部の画像ファイルでは、ヘッダーに「ビット深度」フィールドがあります。ヘッダーをデコードした後、ピクセル値を「ピクセル」配列に読み込みます。これまでのところ、16bpp を超えたことはないので、大丈夫です。しかし、32bpp の場合はどうなるでしょうか。

私がやりたいのは、実行時にピクセルのタイプを決定することです。ヘッダーからビット深度を読み取った後、ピクセル データをメモリにコピーする前に、これを実行したいと考えています。何か案は?

4

3 に答える 3

2

問題を要約すると、 ushort [、]ピクセルフィールド(16ビット/ピクセル)とuint32 [、]ピクセルフィールド(32ビット/ピクセル)を持つクラスを作成できるようにする必要があります。。これを実現するには、いくつかの異なる方法があります。

32ビットおよび16ビットのサブクラスでPixelクラスを作成し、wazooのさまざまな演算子をオーバーライドすることで、ushort / uint32の代わりを作成できますが、これには多くのオーバーヘッドが発生し、正しく理解するのが難しく、決定するのがさらに難しくなります。その権利があれば。または、ピクセルデータのプロキシクラスを作成することもできます(ushort [、]またはuint32 [、]配列が含まれ、必要なすべてのアクセサーが役立ちます)。欠点は、16ビット/ 32ビットモードフラグに応じて、いずれかの方法で実行されるImageDataクラスに多くの特殊なケースのコードが含まれる可能性があることです。

より良い解決策は、ImageDataを16ビットクラスと32ビットクラスにサブクラス化し、ファクトリメソッドを使用してインスタンスを作成することだと思います。たとえば、ImageDataは基本クラス、ImageData16bppとImageData32bppはサブクラス、静的メソッドImageData.Create(string imageFilename)は、ヘッダーデータに応じてImageData16bppまたはImageData32bppのいずれかを作成するファクトリメソッドです。例えば:

public static ImageData Create(string imageFilename)
{
   // ...
   ImageDataHeader imageHeader = ParseHeader(imageFilename);
   ImageData newImageData;
   if (imageHeader.bpp == 32)
   {
      newImageData = new ImageData32(imageFilename, imageHeader);
   }
   else
   {
      newImageData = new ImageData16(imageFilename, imageHeader);
   }
   // ...
   return newImageData;
}
于 2008-09-18T22:48:56.580 に答える
2

コンストラクターでその作業を行うべきではないと思います-私の意見では、コンストラクターはそれほど多くの作業を行うべきではありません。ファイルを読み取ってビット深度を決定するファクトリ メソッドを使用してから、クラスの正しいジェネリック バリアントを構築してそれを返します。

于 2008-09-18T22:23:46.577 に答える
0

デコード関数に、すべての配列の基本クラスであるArray型のオブジェクトを返すようにします。次に、タイプを気にする人は、ピクセルを調べたい場合は「if(a is ushort [、])」などを実行できます。この方法で行う場合は、その逆ではなく、ImageDataで配列を割り当てる必要があります。

あるいは、発信者はおそらく、使用したいピクセル配列の種類を知っています。8bppまたは16bppの画像であっても、32bppの画面にデコードする場合は、ushortの代わりにuintを使用する必要があります。したがって、T型が何であれ整数にデコードするImageData関数を書くことができます。

問題の根本は、必要な出力形式の種類を決定する方法がわからないことです。最初にそれを理解する必要があり、次にプログラム構文が来ます。

于 2008-09-18T22:39:08.130 に答える