アタッチ (外部メモリ×複数チャネル指定)

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

Syntax

C#
public virtual void Attach(
	IEnumerable<CFviPixelScanner> scanner
)
Visual Basic
Public Overridable Sub Attach ( 
	scanner As IEnumerable(Of CFviPixelScanner)
)

Parameters

scanner
Type: System.Collections.Generic..::..IEnumerable<(Of <(<'CFviPixelScanner>)>)>
外部メモリ情報の配列

Remarks

引数に指定された外部メモリにアタッチします。 このオブジェクトが保有する画像メモリは事前に破棄されます。 設定されている処理ウィンドウはクリアされ、全面を指定したウィンドウに初期化されます。

配列の要素数分のチャネルを確保して、各外部メモリ情報に各チャネルをアタッチします。 配列の要素数は 1~16 の範囲で指定してください。 各外部メモリ情報のサイズは一致している必要があります。

外部のメモリを使用する為、メモリの生成・破棄は使用者にゆだねられます。 その為、適切なタイミングで破棄しなければメモリアクセス違反が発生します。 下記の点に注意してご使用ください。

  • アタッチされるメモリは、必ず、このクラスの画像フォーマットでなければいけません。 指定したサイズよりもメモリ量が少なかった場合、画像処理中にメモリアクセス違反が発生します。 逆に、サイズよりも大きかった場合、正しい画像処理ができない可能性があります。
  • アタッチされた画像メモリは、デタッチされるか、このインスタンスが破棄されるまでメモリ上になければなりません。 メモリを削除する場合は、先にデタッチを行うか、インスタンスを破棄してください。
  • アタッチされる画像メモリは、同じメモリ空間に存在するか共有メモリ上に存在する必要があります。
  • CFviPixelScanner の画像アドレスのポインタが進行している場合や、 Offset が 0 以外に設定されている場合は正常にアタッチできません。

ビット深度は以下の条件によって設定されます。

  • ImageType に変更があった場合: メモリが確保されるビット深度に変更
  • ImageType に変更が無い場合: ビット深度に変更なし

設定された値を変更する場合は Depth を使用してください。 設定されている処理ウィンドウはクリアされ、全面を指定したウィンドウに初期化されます。

処理に失敗した場合は例外を発行します。 例外の原因と発生位置を特定するには、発行された例外クラスの ErrorCode メンバと Function メンバを参照してください。

エラーコード:

ErrorCode メンバ内容
1FVIL.ErrorCode.FAILED_TO_ALLOCATEメモリが不足しています。
11FVIL.ErrorCode.INVALID_PARAMETER引数に指定された値が不正です。
1FVIL.ErrorCode.NOT_ALLOCATED画像アドレスに IntPtr.Zero が指定されています。
17FVIL.ErrorCode.INVALID_IMAGESIZE画像サイズに 0 が指定されています。
16FVIL.ErrorCode.INVALID_IMAGETYPE画像種別が無効です。
18FVIL.ErrorCode.INVALID_CHANNELチャネル数が無効です。
12FVIL.ErrorCode.INVALID_OBJECTオブジェクトが不正です。オフセットが 0,0 でない画像にはアタッチできません。

Examples

ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using fvalgcli;    // FvPluginXXXX attribute requires fvalgcli

namespace User.SampleCode.Data
{
    public partial class Image
    {
        [FvPluginExecute]
        public void Attach5()
        {
            const int width = 150;
            const int height = 100;
            const int channels = 3;
            const FVIL.ImageType type = FVIL.ImageType.UC8;
            IntPtr[] addrs = new IntPtr[channels];
            for (int i = 0; i < addrs.Length; i++)
                addrs[i] = IntPtr.Zero;

            try
            {
                int bpp = FVIL.Data.CFviImage.CalcBppOfImageType(type);
                fvalgcli.SIZE_T wbytes = FVIL.Data.CFviImage.CalcHorzByte(width, bpp);
                fvalgcli.SIZE_T allocate_size = wbytes * height;

                // 1) 領域確保.
                for (int i = 0; i < addrs.Length; i++)
                {
                    var addr = fvalgcli.api.fnOAL_malloc(allocate_size);
                    if (addr == IntPtr.Zero)
                        throw new fvalgcli.FvException(fvalgcli.f_err.F_ERR_NOMEMORY);
                    addrs[i] = addr;
                }

                // (2) アタッチ.
                using (var act = new FVIL.Data.CFviImage())
                {
                    FVIL.Data.CFviPixelScanner[] scans =
                    {
                        new FVIL.Data.CFviPixelScanner(addrs[0], width, height, type, wbytes, IntPtr.Zero),
                        new FVIL.Data.CFviPixelScanner(addrs[1], width, height, type, wbytes, IntPtr.Zero),
                        new FVIL.Data.CFviPixelScanner(addrs[2], width, height, type, wbytes, IntPtr.Zero),
                    };
                    act.Attach(scans);
                }
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                // E) 手動で解放する必要があります.
                for (int i = 0; i < addrs.Length; i++)
                {
                    if (addrs[i] != IntPtr.Zero)
                        fvalgcli.api.fnOAL_free(addrs[i]);
                }
            }
        }
    }
}

Exceptions

ExceptionCondition
FVIL..::..CFviExceptionこの例外の原因については、上記のエラーコード表をご参照ください。

See Also