画像データの複製 (2)
Namespace: FVIL.IplAssembly: 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 フィールドに有効なアドレスが設定されている必要があります。
処理可能な条件については、本クラスの説明と後述の対応表をご参照ください。
複製可能な画像オブジェクト:
- CFviImage ... 画像オブジェクト
- CFviGdiImage ... GDI 画像オブジェクト
- FHANDLE ... FIE 画像オブジェクト (下記のオブジェクトタイプ)
カラー画像の濃淡化:
カラー画像を濃淡化する際の係数は 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 メンバ | 内容 |
---|---|---|
1 | FVIL.ErrorCode.FAILED_TO_ALLOCATE | 領域の確保に失敗しました。 |
11 | FVIL.ErrorCode.INVALID_PARAMETER | 引数に指定されたインスタンスが不正です。 |
16 | FVIL.ErrorCode.INVALID_IMAGETYPE | 対応する画像種別がありません。 |
17 | FVIL.ErrorCode.INVALID_IMAGESIZE | 幅、高さが許容範囲外です。 |
18 | FVIL.ErrorCode.INVALID_CHANNEL | チャネル数が許容範囲外です。 |
21 | FVIL.ErrorCode.NOT_SUPPORTED | サポートしていない条件が指定されました。 |
23 | FVIL.ErrorCode.NOT_ALLOCATED | 画像データ領域が確保されていません。 |
96 | FVIL.ErrorCode.NOMATCH_IMAGESIZE | 画像の幅または高さが一致していません。 |
97 | FVIL.ErrorCode.NOMATCH_CHANNEL | 画像のチャネル数が一致していません。 |
Examples
トピック:
C#:
IPL → CFviImage:
IPL → CFviGdiImage:
IPL → FHANDLE:
Visual Basic:
IPL → CFviImage:
IPL → CFviGdiImage:
IPL → FHANDLE:
C#:
IPL → CFviImage:
C# | Copy |
---|---|
// $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 |
---|---|
// $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 |
---|---|
// $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 |
---|---|
' $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 |
---|---|
' $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 |
---|---|
' $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
Exception | Condition |
---|---|
FVIL..::..CFviException | この例外の原因については、上記のエラーコード表をご参照ください。 |