1

現在NSimageクラスでサポートされていない特定の画像形式を描画して処理するアプリケーションを開発しています。この特定の形式では、画像は1Dバイナリテーブルの形式であり、その前にデータ(数値の次元、画像サイズ、ピクセルあたりのビット数など)を説明するASCIIヘッダーが付いています。

ココ描画ガイドで、新しい画像表現を作成できることを読みました。私はCocaおよびObjectiv-Cプログラミングに不慣れであり、このトピックに関して、Coco描画ガイドの説明は非常に短く、あまり役に立ちません。新しい画像表現を作成する方法に関するいくつかのサンプルコードを使用して、より詳細な情報を取得することに興味があります。また、Cocoaアプリケーションが新しい画像表現を正しく解釈するために、initWithDataメソッドとDrawメソッドを上書きする方法を理解することに特に興味があります。

メソッドがより詳細に説明されているリンクを私と共有している人はいますか?

4

1 に答える 1

1

画像形式を描画するだけで、アプリから再度渡すことを特に気にしない場合は、サブクラス化を忘れて、画像に一致する少しの深さと寸法でをNSImageRep作成することをお勧めします。NSBitmapImageRep次に、そのことを要求します-bitmapData

これにより、直接アドレス指定できる生のバッファが得られ、画像の各ピクセルを文字通りバッファ内の適切な場所に1つずつコピーします。

本当にカスタムNSImageRepが必要な場合は、サブクラスNSImageRepを作成するだけで、initWithData:メソッドで画像データをivarに保存し、さまざまなメソッドをすべて呼び出して、画像担当者に設定方法を指示します。-setBitsPerSample:-setPixelsHigh:など。クラスのドキュメントではNSImageRep、イメージを初期化するときに呼び出す必要のあるメソッドについて説明しています。

実装-drawするには、文字通り現在のコンテキストでピクセルを描画する必要があります。明らかに、これをどのように行うかは、描画する画像のタイプによって異なります(たとえば、ベクター形式では、ビットマップ形式とは非常に異なる描画コードが使用されます)。

ビットマップイメージを描画する1つの方法は、ピクセルをループして、ピクセルNSRectFill()ごとに1ピクセルサイズの長方形で呼び出すことです。これは、特に効率的ではありませんが、かなり高速です。

ただし、NSBitmapImageRepビットマップコンテキスト(から返される)でピクセルを-bitmapData直接作成して操作することをお勧めします。CGImageRep次に、から取得できるを描画できますNSBitmapImageRep。メソッドでを作成する場合はNSBitmapImageRepinitWithData:ピクセルを1回割り当てるだけで済みます。

于 2011-11-18T00:44:07.793 に答える