画像データの複製 (2)

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

Syntax

C#
public virtual void CopyTo(
	Object dst
)
Visual Basic
Public Overridable Sub CopyTo ( 
	dst As Object
)

Parameters

dst
Type: System..::..Object
複製先 (画像オブジェクトの再確保は行わず、画像データのみが複製されます。)

Remarks

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

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

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


カラー画像の濃淡化:

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


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

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


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

IPL 側WIL 側 (8bpp)WIL 側 (24bpp)WIL 側 (32bpp)
x1ch 同一の値を書き込みます。 RGB フィールドに同一の値を書き込みます。
RGB フィールドに同一の値を書き込みます。
A フィールドは上書きしません。
x2ch (非対応) (非対応) (非対応)
x3ch 濃淡化して書き込みます。
IPL 側のチャネル 0,1,2 が B,G,R を表わします。
チャネル 0,1,2 を B,G,R に書き込みます。
チャネル 0,1,2 を B,G,R に書き込みます。
A フィールドは上書きしません。
x4ch 濃淡化して書き込みます。
IPL 側のチャネル 0,1,2,3 が B,G,R,A を表わします。
3 チャネル目は無視します。
チャネル 0,1,2 を B,G,R に書き込みます。
3 チャネルは無視します。
チャネル 0,1,2,3 を B,G,R,A に書き込みます。
※ 書き込みは常にキャストコピーです。スケーリングや飽和処理は行いません。


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

IPL 側WIL 側 (Unpack x1ch)WIL 側 (Unpack xNch)WIL 側 (RGB x1ch)
x1ch 同一の値を書き込みます。 各チャネルに同一の値を書き込みます。
RGB フィールドに同一の値を書き込みます。
RGBQUAD の場合、 A フィールドは上書きしません。
x2ch (非対応) チャネル 0,1 を 1,0 に書き込みます。
チャネル数が一致している必要があります。
(非対応)
x3ch 濃淡化して書き込みます。
IPL 側のチャネル 0,1,2 が B,G,R を表わします。
チャネル 0,1,2 を 2,1,0 に書き込みます。
チャネル数が一致している必要があります。
チャネル 0,1,2 を B,G,R に書き込みます。
RGBQUAD の場合、A フィールドは上書きしません。
x4ch 濃淡化して書き込みます。
IPL 側のチャネル 0,1,2,3 が B,G,R,A を表わします。
3 チャネル目は無視します。
チャネル 0,1,2,3 を 2,1,0,3 に書き込みます。
チャネル数が一致している必要があります。
チャネル 0,1,2,3 を B,G,R,A に書き込みます。
RGBTRIPLE の場合、3 チャネルは無視します。
※ 書き込みは常にキャストコピーです。スケーリングや飽和処理は行いません。
※ 表中の 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 CopyTo1()
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().Name);

            // 1) 画像準備.
            IntPtr src = cvLoadImage ("floppy_RGB.jpg", CV_LOAD_IMAGE.CV_LOAD_IMAGE_COLOR);
            if (src == IntPtr.Zero)
                throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvLoadImage");

            // 2) ポインタを IplImageConverter に設定する.
            FVIL.Ipl.IplImageConverter converter = new FVIL.Ipl.IplImageConverter(src);

            // 3) 画像サイズ情報の取得.
            FVIL.ImageSize dst_size = converter.ToImageSize();

            // 4) 確保.(取得したサイズ情報に従って確保する)
            FVIL.Data.CFviImage dst = new FVIL.Data.CFviImage(dst_size);

            // 5) 複製.(CFviImage へ画像データを複製する)
            converter.CopyTo( dst );

            // -) 確認.(任意)
            dst.Save("IplImageConverter_CopyTo1.png");

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

[↑戻る]


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 CopyTo2()
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().Name);

            // 1) 画像準備.
            IntPtr src = cvLoadImage ("floppy_RGB.jpg", CV_LOAD_IMAGE.CV_LOAD_IMAGE_COLOR);
            if (src == IntPtr.Zero)
                throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvLoadImage");

            // 2) ポインタを IplImageConverter に設定する.
            FVIL.Ipl.IplImageConverter converter = new FVIL.Ipl.IplImageConverter(src);

            // 3) 画像サイズ情報の取得.
            int width = converter.Width;
            int height = converter.Height;
            int bpp = (converter.Channels == 1) ? 8 : 32;

            // 4) 確保.(取得したサイズ情報に従って確保する)
            FVIL.GDI.CFviGdiImage dst = new FVIL.GDI.CFviGdiImage(width, height, bpp);

            // 5) 複製.(CFviGdiImage へ画像データを複製する)
            converter.CopyTo( dst );

            // -) 確認.(任意)
            dst.Save("IplImageConverter_CopyTo2.png");

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

[↑戻る]


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 CopyTo3()
        {
            Console.WriteLine(MethodBase.GetCurrentMethod().Name);

            IntPtr src = IntPtr.Zero;
            FHANDLE        hdst = IntPtr.Zero;

            try
            {
                // 1) 画像準備.
                src = cvLoadImage ("floppy_RGB.jpg", CV_LOAD_IMAGE.CV_LOAD_IMAGE_COLOR);
                if (src == IntPtr.Zero)
                    throw new FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvLoadImage");

                // 2) ポインタを IplImageConverter に設定する.
                FVIL.Ipl.IplImageConverter converter = new FVIL.Ipl.IplImageConverter(src);

                // 3) 画像サイズ情報の取得.
                int width = converter.Width;
                int height = converter.Height;
                int channels = converter.Channels;
                f_imgtype type = 0;
                switch((IPL_DEPTH)converter.Depth)
                {
                default:
                    throw new System.NotSupportedException();
                case IPL_DEPTH.IPL_DEPTH_8U : type = f_imgtype.F_IMG_UC8; break;
                case IPL_DEPTH.IPL_DEPTH_16U: type = f_imgtype.F_IMG_US16; break;
                case IPL_DEPTH.IPL_DEPTH_16S: type = f_imgtype.F_IMG_S16; break;
                case IPL_DEPTH.IPL_DEPTH_32S: type = f_imgtype.F_IMG_I32; break;
                case IPL_DEPTH.IPL_DEPTH_32F: type = f_imgtype.F_IMG_FLOAT; break;
                case IPL_DEPTH.IPL_DEPTH_64F: type = f_imgtype.F_IMG_DOUBLE; break;
                }

                // 4) 確保.(取得したサイズ情報に従って確保する)
                hdst = api.fnFIE_img_root_alloc(type, channels, width, height);

                // 5) 複製.(CFviGdiImage へ画像データを複製する)
                converter.CopyTo( hdst );

                // -) 確認.(任意)
                api.fnFIE_save_png("IplImageConverter_CopyTo3.png", hdst, -1);
            }
            finally
            {
                // 6) 解放.
                cvReleaseImage( ref src );
                api.fnFIE_free_object(hdst);
            }
        }
    }
}

[↑戻る]



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 CopyTo1()
            Console.WriteLine(MethodBase.GetCurrentMethod().Name)

            ' 1) 画像準備.
            Dim src As IntPtr = cvLoadImage("floppy_RGB.jpg", CV_LOAD_IMAGE.CV_LOAD_IMAGE_COLOR)
            If src = IntPtr.Zero Then
                Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvLoadImage")
            End If

            ' 2) ポインタを IplImageConverter に設定する.
            Dim converter As New FVIL.Ipl.IplImageConverter(src)

            ' 3) 画像サイズ情報の取得.
            Dim dst_size As FVIL.ImageSize = converter.ToImageSize()

            ' 4) 確保.(取得したサイズ情報に従って確保する)
            Dim dst As New FVIL.Data.CFviImage(dst_size)

            ' 5) 複製.(CFviImage へ画像データを複製する)
            converter.CopyTo(dst)

            ' -) 確認.(任意)
            dst.Save("IplImageConverter_CopyTo1.png")

            ' 6) 解放.(IplImage を 解放する)
            cvReleaseImage(src)
        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 CopyTo2()
            Console.WriteLine(MethodBase.GetCurrentMethod().Name)

            ' 1) 画像準備.
            Dim src As IntPtr = cvLoadImage("floppy_RGB.jpg", CV_LOAD_IMAGE.CV_LOAD_IMAGE_COLOR)
            If src = IntPtr.Zero Then
                Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvLoadImage")
            End If

            ' 2) ポインタを IplImageConverter に設定する.
            Dim converter As New FVIL.Ipl.IplImageConverter(src)

            ' 3) 画像サイズ情報の取得.
            Dim width As Integer = converter.Width
            Dim height As Integer = converter.Height
            Dim bpp As Integer = If((converter.Channels = 1), 8, 32)

            ' 4) 確保.(取得したサイズ情報に従って確保する)
            Dim dst As New FVIL.GDI.CFviGdiImage(width, height, bpp)

            ' 5) 複製.(CFviGdiImage へ画像データを複製する)
            converter.CopyTo(dst)

            ' -) 確認.(任意)
            dst.Save("IplImageConverter_CopyTo2.png")

            ' 6) 解放.(IplImage を 解放する)
            cvReleaseImage(src)
        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 CopyTo3()
            Console.WriteLine(MethodBase.GetCurrentMethod().Name)

            Dim src As IntPtr = IntPtr.Zero
            Dim hdst As FHANDLE = IntPtr.Zero

            Try
                ' 1) 画像準備.
                src = cvLoadImage("floppy_RGB.jpg", CV_LOAD_IMAGE.CV_LOAD_IMAGE_COLOR)
                If src = IntPtr.Zero Then
                    Throw New FVIL.CFviException(FVIL.ErrorCode.FAILED_TO_ALLOCATE, "cvLoadImage")
                End If

                ' 2) ポインタを IplImageConverter に設定する.
                Dim converter As New FVIL.Ipl.IplImageConverter(src)

                ' 3) 画像サイズ情報の取得.
                Dim width As Integer = converter.Width
                Dim height As Integer = converter.Height
                Dim channels As Integer = converter.Channels
                Dim type As f_imgtype = 0
                Select Case CType(converter.Depth, IPL_DEPTH)
                    Case IPL_DEPTH.IPL_DEPTH_8U
                        type = f_imgtype.F_IMG_UC8
                        Exit Select
                    Case IPL_DEPTH.IPL_DEPTH_16U
                        type = f_imgtype.F_IMG_US16
                        Exit Select
                    Case IPL_DEPTH.IPL_DEPTH_16S
                        type = f_imgtype.F_IMG_S16
                        Exit Select
                    Case IPL_DEPTH.IPL_DEPTH_32S
                        type = f_imgtype.F_IMG_I32
                        Exit Select
                    Case IPL_DEPTH.IPL_DEPTH_32F
                        type = f_imgtype.F_IMG_FLOAT
                        Exit Select
                    Case IPL_DEPTH.IPL_DEPTH_64F
                        type = f_imgtype.F_IMG_DOUBLE
                        Exit Select
                    Case Else
                        Throw New System.NotSupportedException()
                End Select

                ' 4) 確保.(取得したサイズ情報に従って確保する)
                hdst = api.fnFIE_img_root_alloc(type, channels, width, height)

                ' 5) 複製.(CFviGdiImage へ画像データを複製する)
                converter.CopyTo(hdst)

                ' -) 確認.(任意)
                api.fnFIE_save_png("IplImageConverter_CopyTo3.png", hdst, -1)
            Finally
                ' 6) 解放.
                cvReleaseImage(src)
                api.fnFIE_free_object(hdst)
            End Try
        End Sub
    End Class
End Namespace

[↑戻る]


Exceptions

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

See Also