生データ処理

Aspose.PSD APIのパフォーマンスを向上させるために、バージョン2.4.0で生データ処理のメソッドが導入されました。生データ処理は現在内部で使用され、外部APIを持っているため、ライブラリの外部から使用して全体的なパフォーマンスを向上させることができます。処理は時々少し複雑になり、説明が必要です。生データ処理は現在BMP形式のみで利用可能です。

開発者が最高のパフォーマンスを得るために、Aspose.PSD APIは生データ処理システムを提供しており、生データ処理には外部APIがあり、生データ処理を使用するためにはLoadRawDataメソッドファミリーとSaveRawDataメソッドファミリーを呼び出す必要があります。これらのメソッドを使用するには、RawDataSettingsクラスを使用して欲しい生データ形式を指定する必要があります。RawDataSettingsクラスを使用すると、開発者は任意の生データ形式を指定することができます。ただし、最高のパフォーマンスを得るには、データが格納されている生データ形式を使用する必要があります。RasterImageクラスで定義されたRawDataSettingsは、画像の生データ形式を決定するのに役立ちます。RawDataSettingsインスタンスをLoadRawDataメソッドに渡すと、データは変換が適用されずにそのまま返され、パフォーマンスが向上する可能性があります。一方、場合によっては、少し複雑になる可能性がある生データのレイアウトに注意する必要があります。

処理を簡略化するために、パフォーマンスに多少のペナルティがかかりますが、RawDataSettingsを指定してデシリアライズすることができます。指定した形式で生データを返すことができない場合(たとえば、バージョン2.4.0ではCMYKカラースペースからRGBへの変換が利用できない場合があります)、また、画像形式で生データ処理が利用できない場合があります。LoadRawDataおよびSaveRawDataメソッドファミリーを使用できるかどうかを判断するには、IsRawDataAvailableプロパティをクエリする必要があります。

洞察

RGBピクセルデータ形式の場合、インデックス(パレットベース)とRGBベースの生データ形式が利用可能です。インデックス生データ形式には、0..(2^ビット数 - 1)の範囲にパレットエントリインデックスが含まれています。インデックス生データ形式には1、2、4、8ビットのピクセルがあります。その他はRGBベースの生データ形式です。生データをロードする際には、データをロードするのに十分なバイトがあることを確認してください。それ以外の場合、適切な例外がスローされます。単純に、ラインサイズを行数に乗じてバイト配列のサイズを推定することができます。ラインサイズは、生データのストレージ形式により異なります。

最高のパフォーマンスを得るためには、常にRasterImage.RawLineSizeプロパティ値と等しい生データラインサイズを使用してください。ただし、場合によっては、生データ行に追加のパディングを追加する必要があるか、または削除する必要がある場合があり、その場合は異なるラインサイズを使用することもできます。画像のバウンディング矩形のサブセットが必要な場合は、インデックスRGBピクセル形式のビットシフトを考慮する必要があります。たとえば、次のような簡単な計算式を使用して、要求されるピクセルが始まる正しいビットを計算することができます:(rect.Left * bitsCount) % 8。

インデックスRGBカラー変換

できるだけ高いパフォーマンスを得るためには、常に同じソースと対象の生データ設定、ピクセルフォーマット、およびラインサイズを使用してください。ただし、場合によってはデータ変換が必要な場合があります。たとえば、1ビットパーピクセルRGB画像をロードして2ビットパーピクセルで保存したり、4ビットのRGB画像を2ビットパーピクセルのカラーレンジを低下させたりする必要があるかもしれません。いずれの場合も、カラー変換を適用する必要があります。インデックスRGB画像を変換することは時々複雑で、いくつかの設定なしでは実行できないことがあります。ソースカラーレンジがどのように対象のカラースペースにマッピングされるかを決定する必要があります。このタスクを達成するために、異なるモードがあります:

パレットコンバージョンを使用すると、ソースカラースペースは可能な限りターゲットカラースペースに一致しようとします。たとえば、次の色を持つ4ビット画像があるとしましょう: [0] RGB=0, 0, 0 [1] RGB=17, 17, 17 [2] RGB=34, 34, 34 … … … [15] RGB=255, 255, 255

ソース画像は次のように見えます: (画像は省略)

そして、4ビット画像を次のパレットカラーが定義されている1ビット画像に変換します:

[0] RGB = 0, 0, 0 [1] RGB = 255, 255, 255

パレット変換モードでは、コンバーターはソースカラーを読み取り、ターゲットパレットのGetNearestColorIndexメソッドを使用してターゲットインデックスを決定します。Target palette’s GetNearestColorIndexメソッドが範囲外のインデックスを返した場合、RasterImage.RawFallbackIndexプロパティ値が使用されます。これにより、ソースカラーが強度値の点で可能な限りターゲットカラーに最も近いものに変換されます。結果は次のようになります: (画像は省略)

生データマッピングモードでは、異なるシナリオが使用されます。ソースとターゲットカラーパレットは単純に無視され、ソースインデックスが対象インデックスにマップされます。値がターゲットレンジにマップできない場合(ビット数を減らす場合など)、RasterImage.RawFallbackIndexプロパティ値が使用されます。この値はデフォルトで0であり、対象パレットの最初の色にマップされます。このプロパティ値が対象レンジ外にある場合、適切な例外がスローされます。これにより、より予測不能な結果が発生する可能性があります: (画像は省略)

パレット変換モードは、カラーマッピングの問題に対するより正確な解決策ですが、正しいパレットマッピングを推定するために計算が実行されるため、完了には少し時間がかかります(通常、両方の方法間には非常に小さなパフォーマンスの違いがあります)。一方、生データマッピングモードは少し高速に動作し、正確なカラーマッピングがそこまで重要でないときに使用できます。たとえば、ソースカラーパレットがトリムされており、余分なビットが使用されていない場合、ビット数を減らしてセーフリーに変換できる場合があります。

これらのアプローチのいずれかを使用するには、RasterImageクラスのRawDitheringMethodプロパティを使用してください。デフォルトでは、最良の見た目の結果を得るためにパレット変換メソッドに設定されています。このプロパティを変換が行われる前に設定することができます(たとえば、画像をストリームに保存する場合)。元のピクセルデータの一部を書き換えた場合、パレットを無視したり、パレット変換のディザリングメソッドを使用しないでください。新しいデータはキャッシュに移動され、キャッシュはデータを32ARGB形式の最大利用可能フォーマットで保存します(2.4.0現在、変更の可能性があります)。この形式は、ロードおよび保存された画像の可能性がある異なるカラーレンジの問題を克服するために使用されます。さらに、RGBモードで画像をロードし、インデックスモードに変換したり、その逆の場合は、パレット無視とパレット変換のディザリングメソッドは無視されます。

カスタムカラーコンバーター

時には、カラー変換の標準アプローチを使用するだけでは十分ではありません。カスタムアルゴリズムを使用してカラー変換ルーチンを完全に自由に使用したい場合があります。ソースとターゲット画像のピクセル形式が両方ともインデックスRGB形式の場合、より単純なインターフェースであるIIndexedColorConverterを使用できます。RasterImage.RawIndexedColorConverterプロパティをIIndexedColorConverterインターフェースのインスタンスに設定し、RawDitheringMethodプロパティ値にDitheringMethods.CustomConverterを使用します。この組み合わせが暗示される場合、インデックスされた任意のカラー変換は、指定されたIIndexedColorConverterインスタンスを介して行われます。カスタムインデックスカラーコンバーターには、次のメソッドが定義されています: (コードは省略)

FillIndexedtoIndexedMapメソッドは、インデックスRGB画像からインデックスRGB画像形式(1、2、4、8ビットのいずれかがお互いに変換される場合)への変換が必要な場合に呼び出されます。マップ配列には、すべての可能なソースフォーマットエントリの数が含まれます。その配列をソースカラーパレットエントリから宛先パレットエントリへのマッピングに埋める必要があります。宛先のインデックス値は、0..(ビット数 - 1)の範囲内になければならず、それ以外の場合は適切な例外がスローされます。

よりカスタムのカラー変換シナリオを実行する必要がある場合は、RasterImage.RawCustomColorConverterプロパティをIColorConverterインターフェースのインスタンスに設定する必要があります。両方のプロパティが設定されており、インデクス付きカラーコンバーターが使用されない場合は、必要に応じて変換操作が行われます。IColorConverterは次の単一のメソッドを持っています: (コードは省略)

Convertメソッドは、カラー変換が必要なたびに呼び出されます。メソッドは、ソースフォーマットのソース生データを受け取り、目的地に変換されたカラーフォーマットを受け取るための出力バッファを持っています。インターフェース呼び出しは、Aspose.PSDライブラリによって内部的に行われます。変換されたデータがメソッドの戻り時に出力バッファに含まれている必要があります。Convertメソッドは、ソースデータ全体がカバーされるまで何度か呼び出される可能性があります。