アタッチ (外部メモリ指定)

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

Syntax

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

Parameters

scanner
Type: FVIL.Data..::..CFviPixelScanner
外部メモリ情報

Remarks

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

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

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

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

エラーコード:

ErrorCode メンバ内容
1FVIL.ErrorCode.FAILED_TO_ALLOCATEメモリが不足しています。
11FVIL.ErrorCode.INVALID_PARAMETER引数に指定された値が不正です。
23FVIL.ErrorCode.NOT_ALLOCATED画像アドレスに IntPtr.Zero が指定されています。
17FVIL.ErrorCode.INVALID_IMAGESIZE画像サイズに 0 が指定されています。
16FVIL.ErrorCode.INVALID_IMAGETYPE画像種別が無効です。
18FVIL.ErrorCode.INVALID_CHANNELチャネル数が無効です。

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 Attach4()
        {
            const int width = 150;
            const int height = 100;
            const FVIL.ImageType type = FVIL.ImageType.UC8;
            IntPtr addr = 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) 領域確保.
                addr = fvalgcli.api.fnOAL_malloc(allocate_size);
                if (addr == IntPtr.Zero)
                    throw new fvalgcli.FvException(fvalgcli.f_err.F_ERR_NOMEMORY);

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

Exceptions

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

See Also