画像データの複製 (1)

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

Syntax

C#
public virtual Object CopyFrom(
	Object src
)
Visual Basic
Public Overridable Function CopyFrom ( 
	src As Object
) As Object

Parameters

src
Type: System..::..Object
複製元

Return Value

Type: Object
複製後の自身のインスタンスを返します。

Implements

IFviCopyable..::..CopyFrom(Object)

Remarks

同一型が指定された場合は Pointer フィールドに設定されたアドレスをそのままコピーします。
複製処理前の解放や再確保を行わない事にご注意ください。

画像オブジェクトが指定された場合は画像データを複製します。
このインスタンスの Pointer フィールドに有効なアドレスが設定されている必要があります。
処理可能な条件については、本クラスの説明と後述の対応表をご参照ください。

複製可能な画像オブジェクト:


カラー画像の濃淡化:

カラー画像を濃淡化する際の係数は CoefficientRed, CoefficientGreen, CoefficientBlue で変更できます。


対応表: IPL ← CFviImage (画像オブジェクト)

WIL 側IPL 側 (x1ch)IPL 側 (xNch)
Unpack x1ch 同一の値を書き込みます。
各チャネルに同一の値を書き込みます。
4 チャネルまで許容します。
Unpack xNch 濃淡化して書き込みます。
WIL側の チャネル 0,1,2,3 が R,G,B,A を表わします。
3 チャネル目は無視します。
4 チャネルまで許容します。
チャネル数が一致している必要があります。
WIL側は 0,1,2,3 が R,G,B,A を表わします。
IPL側は 0,1,2,3 が B,G,R,A を表わします。
RGB24 x1ch 濃淡化して書き込みます。
3 または 4 チャネルを許容します。
4 チャネルの場合、3チャネル目(A コンポーネント)は上書きしません。
RGB32 x1ch 濃淡化して書き込みます。
3 または 4 チャネルを許容します。
3 チャネルの場合、複製元の A フィールドは無視します。
※ 書き込みは常にキャストコピーです。スケーリングや飽和処理は行いません。
※ 表中の Unpack は ImageType の UC8,US16,S16,I32,F32,D64 を意味します。


対応表: IPL ← CFviGdiImage (GDI 画像オブジェクト)

WIL 側IPL 側 (x1ch)IPL 側 (xNch)
8bpp 同一の値を書き込みます。
各チャネルに同一の値を書き込みます。
4 チャネルまで許容します。
24bpp 濃淡化して書き込みます。
3 または 4 チャネルを許容します。
4 チャネルの場合、3チャネル目(A コンポーネント)は上書きしません。
32bpp 濃淡化して書き込みます。
A フィールドは無視します。
3 または 4 チャネルを許容します。
3 チャネルの場合、複製元の A フィールドは無視します。
※ 書き込みは常にキャストコピーです。スケーリングや飽和処理は行いません。


対応表: IPL ← FHANDLE (FIE 画像オブジェクト)

WIL 側IPL 側 (x1ch)IPL 側 (xNch)
Unpack x1ch 同一の値を書き込みます。
各チャネルに同一の値を書き込みます。
4 チャネルまで許容します。
Unpack xNch 濃淡化して書き込みます。
WIL側の チャネル 0,1,2,3 が R,G,B,A を表わします。
3 チャネル目は無視します。
4 チャネルまで許容します。
チャネル数が一致している必要があります。
WIL側は 0,1,2,3 が R,G,B,A を表わします。
IPL側は 0,1,2,3 が B,G,R,A を表わします。
RGBTRIPLE x1ch 濃淡化して書き込みます。
3 または 4 チャネルを許容します。
4 チャネルの場合、3チャネル目(A コンポーネント)は上書きしません。
RGBQUAD x1ch 濃淡化して書き込みます。
3 または 4 チャネルを許容します。
3 チャネルの場合、複製元の A フィールドは無視します。
※ 書き込みは常にキャストコピーです。スケーリングや飽和処理は行いません。
※ 表中の Unpack は f_imgtype の UC8,US16,S16,I32,FLOAT,DOUBLE を意味します。


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


エラーコード:
ErrorCode メンバ内容
1FVIL.ErrorCode.FAILED_TO_ALLOCATE領域の確保に失敗しました。
11FVIL.ErrorCode.INVALID_PARAMETER引数に指定されたインスタンスが不正です。
16FVIL.ErrorCode.INVALID_IMAGETYPE対応する画像種別がありません。
17FVIL.ErrorCode.INVALID_IMAGESIZE幅、高さが許容範囲外です。
18FVIL.ErrorCode.INVALID_CHANNELチャネル数が許容範囲外です。
21FVIL.ErrorCode.NOT_SUPPORTEDサポートしていない条件が指定されました。
23FVIL.ErrorCode.NOT_ALLOCATED画像データ領域が確保されていません。
96FVIL.ErrorCode.NOMATCH_IMAGESIZE画像の幅または高さが一致していません。
97FVIL.ErrorCode.NOMATCH_CHANNEL画像のチャネル数が一致していません。

Examples

トピック:

C#:

IPL ← CFviImage:
C# Copy imageCopy
// $Revision: 1.3 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Reflection;

namespace SampleCode.Ipl
{
    partial class Converter
    {
        public static void CopyFrom1()
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().Name);

            // 1) 画像準備.
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage("floppy_RGB.jpg");

            // 2) IplImage のサイズ情報の取得.
            FVIL.Ipl.IplImageSize size = FVIL.Ipl.IplImageConverter.ToIplImageSize(src);

            // 3) 確保.(取得したサイズ情報に従って確保する)
            IntPtr dst = cvCreateImage(cvSize(size.width, size.height), size.depth, size.channels);
            if (dst == IntPtr.Zero)
                throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvCreateImage");

            // 4) IplImage 構造体へのポインタを IplImageConverter に設定する.
            FVIL.Ipl.IplImageConverter converter = new FVIL.Ipl.IplImageConverter(dst);

            // 5) 複製.(CFviImage から画像データを複製する)
            converter.CopyFrom( src );

            // -) 確認.(任意)
            int[] save_param =
            {
                (int)CV_IMWRITE.CV_IMWRITE_PNG_COMPRESSION,
                3
            };
            cvSaveImage("IplImageConverter_CopyFrom1.png", dst, save_param);

            // 6) 解放.(IplImage を 解放する)
            cvReleaseImage( ref dst );
        }
    }
}

[↑戻る]


IPL ← CFviGdiImage:
C# Copy imageCopy
// $Revision: 1.3 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Reflection;

namespace SampleCode.Ipl
{
    partial class Converter
    {
        public static void CopyFrom2()
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().Name);

            // 1) 画像準備.
            FVIL.GDI.CFviGdiImage src = new FVIL.GDI.CFviGdiImage("floppy_RGB.jpg");

            // 2) IplImage のサイズ情報の取得.
            FVIL.Ipl.IplImageSize size = FVIL.Ipl.IplImageConverter.ToIplImageSize(src);

            // 3) 確保.(取得したサイズ情報に従って確保する)
            IntPtr dst = cvCreateImage(cvSize(size.width, size.height), size.depth, size.channels);
            if (dst == IntPtr.Zero)
                throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvCreateImage");

            // 4) IplImage 構造体へのポインタを IplImageConverter に設定する.
            FVIL.Ipl.IplImageConverter converter = new FVIL.Ipl.IplImageConverter(dst);

            // 5) 複製.(CFviGdiImage から画像データを複製する)
            converter.CopyFrom( src );

            // -) 確認.(任意)
            int[] save_param =
            {
                (int)CV_IMWRITE.CV_IMWRITE_PNG_COMPRESSION,
                3
            };
            cvSaveImage("IplImageConverter_CopyFrom2.png", dst, save_param);

            // 6) 解放.(IplImage を 解放する)
            cvReleaseImage( ref dst );
        }
    }
}

[↑戻る]


IPL ← FHANDLE:
C# Copy imageCopy
// $Revision: 1.3 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Reflection;
using fvalgcli;

namespace SampleCode.Ipl
{
    partial class Converter
    {
        public static void CopyFrom3()
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().Name);

            FHANDLE hsrc = IntPtr.Zero;
            IntPtr dst = IntPtr.Zero;

            try
            {
                // 1) 画像準備.
                api.fnFIE_load_img_file("floppy_RGB.jpg", ref hsrc, f_color_img_type.F_COLOR_IMG_TYPE_RGBQ);
                if (hsrc == IntPtr.Zero)
                    throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "fnFIE_load_img_file");

                // 2) IplImage のサイズ情報の取得.
                FVIL.Ipl.IplImageSize size = FVIL.Ipl.IplImageConverter.ToIplImageSize(hsrc);

                // 3) 確保.(取得したサイズ情報に従って確保する)
                dst = cvCreateImage(cvSize(size.width, size.height), size.depth, size.channels);
                if (dst == IntPtr.Zero)
                    throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvCreateImage");

                // 4) IplImage 構造体へのポインタを IplImageConverter に設定する.
                FVIL.Ipl.IplImageConverter converter = new FVIL.Ipl.IplImageConverter(dst);

                // 5) 複製.(FIE 画像オブジェクトから画像データを複製する)
                converter.CopyFrom( hsrc );

                // -) 確認.(任意)
                int[] save_param =
                {
                    (int)CV_IMWRITE.CV_IMWRITE_PNG_COMPRESSION,
                    3
                };
                cvSaveImage("IplImageConverter_CopyFrom3.png", dst, save_param);
            }
            finally
            {
                // 6) 解放.
                cvReleaseImage( ref dst );
                api.fnFIE_free_object(hsrc);
            }
        }
    }
}

[↑戻る]



Visual Basic:

IPL ← CFviImage:
Visual Basic Copy imageCopy
' $Revision: 1.2 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Reflection

Namespace Ipl
    Partial Class Converter
        Public Shared Sub CopyFrom1()
            Console.WriteLine(MethodBase.GetCurrentMethod().Name)

            ' 1) 画像準備.
            Dim src As New FVIL.Data.CFviImage("floppy_RGB.jpg")

            ' 2) IplImage のサイズ情報の取得.
            Dim size As FVIL.Ipl.IplImageSize = FVIL.Ipl.IplImageConverter.ToIplImageSize(src)

            ' 3) 確保.(取得したサイズ情報に従って確保する)
            Dim dst As IntPtr = cvCreateImage(cvSize(size.width, size.height), size.depth, size.channels)
            If dst = IntPtr.Zero Then
                Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvCreateImage")
            End If

            ' 4) IplImage 構造体へのポインタを IplImageConverter に設定する.
            Dim converter As New FVIL.Ipl.IplImageConverter(dst)

            ' 5) 複製.(CFviImage から画像データを複製する)
            converter.CopyFrom(src)

            ' -) 確認.(任意)
            Dim save_param As Integer() = {CInt(CV_IMWRITE.CV_IMWRITE_PNG_COMPRESSION), 3}
            cvSaveImage("IplImageConverter_CopyFrom1.png", dst, save_param)

            ' 6) 解放.(IplImage を 解放する)
            cvReleaseImage(dst)
        End Sub
    End Class
End Namespace

[↑戻る]


IPL ← CFviGdiImage:
Visual Basic Copy imageCopy
' $Revision: 1.2 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Reflection

Namespace Ipl
    Partial Class Converter
        Public Shared Sub CopyFrom2()
            Console.WriteLine(MethodBase.GetCurrentMethod().Name)

            ' 1) 画像準備.
            Dim src As New FVIL.GDI.CFviGdiImage("floppy_RGB.jpg")

            ' 2) IplImage のサイズ情報の取得.
            Dim size As FVIL.Ipl.IplImageSize = FVIL.Ipl.IplImageConverter.ToIplImageSize(src)

            ' 3) 確保.(取得したサイズ情報に従って確保する)
            Dim dst As IntPtr = cvCreateImage(cvSize(size.width, size.height), size.depth, size.channels)
            If dst = IntPtr.Zero Then
                Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvCreateImage")
            End If

            ' 4) IplImage 構造体へのポインタを IplImageConverter に設定する.
            Dim converter As New FVIL.Ipl.IplImageConverter(dst)

            ' 5) 複製.(CFviGdiImage から画像データを複製する)
            converter.CopyFrom(src)

            ' -) 確認.(任意)
            Dim save_param As Integer() = {CInt(CV_IMWRITE.CV_IMWRITE_PNG_COMPRESSION), 3}
            cvSaveImage("IplImageConverter_CopyFrom2.png", dst, save_param)

            ' 6) 解放.(IplImage を 解放する)
            cvReleaseImage(dst)
        End Sub
    End Class
End Namespace

[↑戻る]


IPL ← FHANDLE:
Visual Basic Copy imageCopy
' $Revision: 1.2 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Reflection
Imports fvalgcli

Namespace Ipl
    Partial Class Converter
        Public Shared Sub CopyFrom3()
            Console.WriteLine(MethodBase.GetCurrentMethod().Name)

            Dim hsrc As FHANDLE = IntPtr.Zero
            Dim dst As IntPtr = IntPtr.Zero

            Try
                ' 1) 画像準備.
                api.fnFIE_load_img_file("floppy_RGB.jpg", hsrc, f_color_img_type.F_COLOR_IMG_TYPE_RGBQ)
                If hsrc = IntPtr.Zero Then
                    Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "fnFIE_load_img_file")
                End If

                ' 2) IplImage のサイズ情報の取得.
                Dim size As FVIL.Ipl.IplImageSize = FVIL.Ipl.IplImageConverter.ToIplImageSize(hsrc)

                ' 3) 確保.(取得したサイズ情報に従って確保する)
                dst = cvCreateImage(cvSize(size.width, size.height), size.depth, size.channels)
                If dst = IntPtr.Zero Then
                    Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvCreateImage")
                End If

                ' 4) IplImage 構造体へのポインタを IplImageConverter に設定する.
                Dim converter As New FVIL.Ipl.IplImageConverter(dst)

                ' 5) 複製.(FIE 画像オブジェクトから画像データを複製する)
                converter.CopyFrom(hsrc)

                ' -) 確認.(任意)
                Dim save_param As Integer() = {CInt(CV_IMWRITE.CV_IMWRITE_PNG_COMPRESSION), 3}
                cvSaveImage("IplImageConverter_CopyFrom3.png", dst, save_param)
            Finally
                ' 6) 解放.
                cvReleaseImage(dst)
                api.fnFIE_free_object(hsrc)
            End Try
        End Sub
    End Class
End Namespace

[↑戻る]


Exceptions

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

See Also