ディスプレイクラス

Namespace: FVIL.GDI
Assembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)

Syntax

C#
[SerializableAttribute]
public sealed class CFviDisplay : CFviObject, 
	ICloneable, IFviCopyable
Visual Basic
<SerializableAttribute>
Public NotInheritable Class CFviDisplay
	Inherits CFviObject
	Implements ICloneable, IFviCopyable

Remarks

画像オブジェクトが持つ画像データを画面に表示するクラスです。 画面への描画は System.Drawing.Graphics が持つ デバイスコンテキストを介して行われます。 設定された画像がパタン(CFviPattern)の場合は、 画像の前面にパタンマスクをオーバレイ処理して表示します。


トピック:



初期値と範囲:
プロパティ初期値範囲変更
ImagenullCFviImage またはその派生クラスのインスタンスこのプロパティで変更可能です。
ImageSize640,480任意Imagenull でなければ、その画像サイズが適用されます。 null の時は、このプロパティで変更可能です。
DisplayRect0,0-1,1任意このプロパティで変更可能です。
ControlPoint0,0任意このプロパティで変更可能です。
Magnification1.00.0 より大きい値このプロパティで変更可能です。
EffectiveRect(無効)(設定不可)DisplayRect, ImageSize, Magnification で決定します。
VisibleRect(無効)(設定不可)DisplayRect, ImageSize, Magnification, ControlPoint で決定します。
OverlaysCFviOverlayList (要素数0個)CFviOverlay またはその派生クラスのインスタンスこのプロパティでコレクションのインスタンスへの参照を取得して直接追加/変更します。
CursorPosition0,0任意このプロパティで変更可能です。
BkModeOpaqueBkMode に定義された定数このプロパティで変更可能です。
BkColorSystem.Drawing.Color.FromRGB(0xFF,0xFF,0xFF) (白)任意このプロパティで変更可能です。
BackgroundCFviGdiBrush の初期値有効なブラシこのプロパティで変更可能です。(但し、インスタンスの差し替えはできません。)
HalftoneModefalsefalse/trueこのプロパティで変更可能です。
PixelModePackingPixelMode に定義された定数このプロパティで変更可能です。
DisplayChannel00~15このプロパティで変更可能です。
MaskBitCount8(設定不可)
MaskAlpha0x7F0x00~0xFFこのプロパティで変更可能です。
MaskColorSystem.Drawing.Color.FromRGB(0xFF,0x00,0x00) (赤)任意このプロパティで変更可能です。
MaskEnablefalsefalse/trueこのプロパティで変更可能です。
EssentialMaskColorSystem.Drawing.Color.FromRGB(0x00,0xFF,0x00) (緑)任意このプロパティで変更可能です。
EssentialMaskEnablefalsefalse/trueこのプロパティで変更可能です。

[↑戻る]


基本的な操作手順:

画像データを描画する為の基本的な操作手順を下記に記載します。

  1. Image に描画対象の画像を設定します。
  2. DisplayRect に表示範囲を指定します。 クライアント領域の任意の位置を指定できます。
  3. ControlPoint に描画対象の画像の表示位置を指定します。
  4. Magnification に描画対象の画像の伸縮率を指定します。
  5. Draw(Graphics) メソッドで描画を実行します。 引数に指定された System.Drawing.Graphics へ画像データを書き出します。 この時、オーバレイに図形データが有る場合は、画像の前面に重畳して表示します。


[↑戻る]


中間バッファについて:

中間バッファとは、描画対象画像が DIB 非互換のとき、デバイスコンテキストへ画像を転送する前に DIB 互換画像に変換するための一時的な作業用バッファのことです。 BackBufferMode に下記の定数を指定することでモードの切り替えができます。

  • Performance (表示速度優先)
    描画に必要な部分のみを中間バッファへコピーします。 表示速度は向上しますが、Halftone モードが無視されるなど、画質に制約があります。
  • Quality (画質優先)
    画像全体を中間バッファへコピーします。 WIL 1.x 系と同じ表示方法です。 描画対象画像のサイズが大きい場合に表示速度に難があります。 また、表示対象画像が 2GB を超える場合は使用できません。

中間バッファは、表示範囲と同じサイズを必要としますが、既定では サイズ=0,0 に設定されており、 描画対象画像と同じサイズが確保されます。 表示範囲(ウィンドウサイズ)が表示対象画像より小さい場合は、 BackBufferSize でサイズを調整することでメモリを節約できます。 但し、サイズの指定は、中間バッファのモードが Performance のときに有効です。 Quality のときは無視されます。

  • サイズ=0,0
    中間バッファのサイズを描画対象画像のサイズに合わせます。 CFviImageView を貼り付けているウィンドウのサイズが可変で、 マルチモニタに跨る場合は、この設定値を推奨します。 但し、表示対象画像が 2GB を超える場合は使用できません。
  • スクリーンサイズ
    CFviImageView を貼り付けているウィンドウのサイズが可変で、 マルチモニタに跨らない場合は、 中間バッファのサイズをスクリーンサイズに合わせることを推奨します。 内部では、必要なサイズを自動的に調整しますので、 指定サイズと表示対象画像の大小関係が頻繁に入れ替わる場合も、固定していて問題ありません。
  • ウィンドウサイズ
    CFviImageView を貼り付けているウィンドウのサイズが固定で、 描画対象画像のサイズより小さい場合は、 中間バッファのサイズをウィンドウサイズに合わせることを推奨します。 例えば、複数の画像をプレビュー表示する場合に、消費メモリを節約できます。

[↑戻る]


表示可能な画像:

このクラスで表示可能な画像データの条件を下表に示します。

  1. DIB互換について
    DIB互換性が互換のものは非互換に比べて描画処理の時間が短く済みます。 DIB非互換のものは、描画の直前に画像データを一時バッファへコピーする処理が行われますが、 互換のものはコピー処理は無く、直接 デバイスコンテキストへ書き込む為です。 但し、この処理ではビットマップハンドルを必要とします。 ハンドルを持たない画像オブジェクトの場合は、 下表の条件を満たしていても非互換と同様の扱いになりますのでご注意ください。
  2. 中間バッファについて
    下表の中間バッファの覧は、前述の『DIB非互換の画像を一時バッファへコピーする処理』で 使用されるバッファのピクセルサイズを表します。
  3. 多ビットの減色について
    多ビットから 8bpp への減色では、 CFviImage.
    Depth に設定されたビット深度が使用されます。 この値が適切に設定されていない場合は、濃度が正確に表示されません。

画像種別
(ImageType)
PixelModeチャネル数DIB互換性中間バッファ備考
BINUnpacking のみ1~16非互換1bpp PixelMode の設定を無視して、常に単一のチャネルを表示します。 ダブルワードオーダーをバイトオーダーに入れ替える処理で中間バッファを必要とします。 (関連:BinaryFormat)
UC8Packing3非互換24bpp 3 チャネルの時、PixelModePacking の場合は、 24 ビットカラーとして表示します。 CH0,1,2 の各画素を 24bpp カラーの R,G,B にパッキングします。 表示用の中間バッファを必要としますので、Unpacking モードに比べて表示負荷が掛かります。
Unpacking1~16互換 表示対象の画像に直接アタッチして表示します。
DIB非互換の画像種別に比べて表示負荷が低く済みます。
US16Packing3非互換24bpp 3 チャネルの時、PixelModePacking の場合は、 24 ビットカラーとして表示します。 CH0,1,2 の各画素を 8bpp に減色した後 24bpp カラーの R,G,B にパッキングします。 表示用の中間バッファを必要とします。
Unpacking1~16非互換8bpp 各画素を 8bpp に減色して表示します。 表示用の中間バッファを必要とします。
UI32Packing3非互換24bpp 3 チャネルの時、PixelModePacking の場合は、 24 ビットカラーとして表示します。 CH0,1,2 の各画素を 8bpp に減色した後 24bpp カラーの R,G,B にパッキングします。 表示用の中間バッファを必要とします。
Unpacking1~16非互換8bpp 各画素を 8bpp に減色して表示します。 表示用の中間バッファを必要とします。
RGB24Unpacking のみ1~16互換 PixelMode の設定を無視して、常に単一のチャネルを表示します。 表示対象の画像に直接アタッチして表示する為、 DIB非互換の画像種別に比べて表示負荷が低く済みます。
RGB32Unpacking のみ1~16互換 PixelMode の設定を無視して、常に単一のチャネルを表示します。 表示対象の画像に直接アタッチして表示する為、 DIB非互換の画像種別に比べて表示負荷が低く済みます。
S16Unpacking のみ1~16非互換24bpp PixelMode の設定を無視して、常に単一のチャネルを表示します。 正の値はグレー、負の値はマゼンタで表示します。 飽和した場合は、各色の最大輝度になります。 表示用の中間バッファを必要とします。
I32Unpacking のみ1~16非互換24bpp PixelMode の設定を無視して、常に単一のチャネルを表示します。 正の値はグレー、負の値はマゼンタで表示します。 飽和した場合は、各色の最大輝度になります。 表示用の中間バッファを必要とします。
I64Unpacking のみ1~16非互換24bpp PixelMode の設定を無視して、常に単一のチャネルを表示します。 正の値はグレー、負の値はマゼンタで表示します。 飽和した場合は、各色の最大輝度になります。 表示用の中間バッファを必要とします。
F32Unpacking のみ1~16非互換24bpp PixelMode の設定を無視して、常に単一のチャネルを表示します。 正の値はグレー、負の値はマゼンタで表示します。 飽和した場合は、各色の最大輝度になります。 表示用の中間バッファを必要とします。
D64Unpacking のみ1~16非互換24bpp PixelMode の設定を無視して、常に単一のチャネルを表示します。 正の値はグレー、負の値はマゼンタで表示します。 飽和した場合は、各色の最大輝度になります。 表示用の中間バッファを必要とします。

オーバレイ描画:

オーバレイは図形データを画像データの前面に重畳して表示する為の透明のレイヤーです。 このクラスに複数のレイヤーを持つことができ、1枚のレイヤーに複数の図形データを管理できます。


図) 表示クラスとオーバレイ:


図) オーバレイと図形データ:


図形データは、それぞれ自身の描画位置や表示属性を保有しています。 図形データの描画位置や表示属性を変更するには、まず、下記の手順でオーバレイから図形データを取得してください。

  1. Overlays からオーバレイを取得します。 -
  2. 取得したオーバレイの Figures から図形データを取得します。 -

描画位置を変更するには、上記の手順で取得した図形データの Position プロパティを使用します。 表示色を変更するには、Pen プロパティを使用します。


[↑戻る]


制限事項:

  1. インスタンス数の制限

    このクラスは、内部にデバイスコンテキストやビットマップハンドルなどの GDI リソースを 保有する為、その合計数が 10,000 個を超えると GDI リソースが枯渇します。 上限は流動的で、その他で GDI リソースを使用していると 10,000 個より少ない値で枯渇することになります。 1つのインスタンスが保有する GDI リソースの数は、最も多い時は 7 個です。 この場合、インスタンスの数は 1428 個(10,000/7)が上限となります。

  2. 画素数の制限

    表示対象画像の幅x高さに合わせて表示用の中間バッファを確保する場合、 サイズ(バイト数)が大きすぎると CreateDIBSection の制限によって中間バッファの確保に失敗する場合があります。 64 bit 環境においてもこの制限が発生します。 その際は、 BackBufferSize で表示用の中間バッファのサイズを小さくしてください。 既定では、0,0 が指定されていますので、 Image で設定された画像オブジェクトと同じサイズになります。 BackBufferSize に 1,1 以上を指定すると、 中間バッファのサイズは BackBufferSize または 画像サイズのいずれか小さい方に調整されます。 この場合、スクリーンサイズを指定することを推奨します。

  3. 幅または高さが 32767 画素を超える 32bpp のカラー画像の表示の制限

    内部で使用している StretchBlt 関数は、幅または高さが 32767 画素を超える 32bpp のカラー画像の表示が行えない制限があります。 そのため、CFviDisplay の画像表示処理で対策を行い、この制限の回避を行っています。 しかしながら、表示範囲 のいずれか1辺が 32767 画素を超える場合は、この制限を回避する方法がないため、正常に表示されない場合があります。 例えば、4K (3840) のモニタ9台 (34560 画素) にまたがるような表示範囲を設定した場合は正常に表示されない場合があります。


[↑戻る]

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL.GDI..::..CFviDisplay

See Also