SSブログ

[.NET]Imageの分割 [Programming .NET Tips]

ファイルから取り込んだImageを複数に分割する機会があったので、
作ってみました。

[ポイント]
(1)Imageオブジェクトを指定した個数で分割します。
   例:縦5個、横10個と指定すると、5×10の2次元配列でImageを作成します。
(2)Imageを分割するには、
   Graphics.DrawImage(Image, Integer, Integer, Rectangle, GraphicsUnit)
   を使います。
(3)参考文献
   『MSDN Library for VisualStudio2008日本語版』

[ソース]
''' <summary>
''' 指定したImageを分割する。
''' </summary>
''' <param name="originalImage">オリジナルImage</param>
''' <param name="verticalNum">分割数(垂直)</param>
''' <param name="horizontalNum">分割数(水平)</param>
''' <returns>分割済Image</returns>
''' <remarks></remarks>
Public Shared Function DivideImage( _
    ByVal originalImage As Image, _
    ByVal verticalNum As IntegerByVal horizontalNum As Integer _
    ) As Image()()

    '引数チェック
    If originalImage Is Nothing Then
        Throw New ArgumentNullException("originalImage is null")
    End If

    If verticalNum < 1 Then
        Throw New ArgumentOutOfRangeException("verticalNum < 1")
    End If

    If horizontalNum < 1 Then
        Throw New ArgumentOutOfRangeException("horizontalNum < 1")
    End If

    Dim g As Graphics = Nothing

    Dim rtnImage()() As Image = New Image(verticalNum - 1)() {}
    For i As Integer = 0 To verticalNum - 1
        rtnImage(i) = New Image(horizontalNum - 1) {}
    Next

    Dim originalSize As Size = originalImage.Size
    Dim divWidth As Integer = originalSize.Width / horizontalNum
    Dim divHeight As Integer = originalSize.Height / verticalNum

    For vCnt As Integer = 0 To verticalNum - 1
        For hCnt As Integer = 0 To horizontalNum - 1
            Try
                '空のImageを作成
                rtnImage(vCnt)(hCnt) = New Bitmap(divWidth, divHeight)
                'Imageを描画する為のGraphicsオブジェクトを作成
                g = System.Drawing.Graphics.FromImage( _
                       rtnImage(vCnt)(hCnt))
                'オリジナルImageから描画対象の領域を算出
                '[補足]
                '   領域の開始座標を
                '   ・hCnt * divWidth
                '   ・vCnt * divHeight
                '   ではなく、
                '   ・hCnt * originalSize.Width / horizontalNum
                '   ・vCnt * originalSize.Height / verticalNum
                '   にしているのは、誤差を軽減する為です。
                Dim rect As New Rectangle( _
                    hCnt * originalSize.Width / horizontalNum, _
                    vCnt * originalSize.Height / verticalNum, _
                    divWidth, _
                    divHeight _
                    )
                'オリジナルImageの内容を描画
                g.DrawImage( _
                     originalImage, 0, 0, rect, GraphicsUnit.Pixel)
            Finally
                If Not (g Is NothingThen
                    'Graphicsオブジェクトを解放
                    g.Dispose()
                End If
            End Try
        Next
    Next

    Return rtnImage
End Function
[VB.NET]Imageを分割する例


/// <summary>
/// 指定したImageを分割する。
/// </summary>
/// <param name="originalImage">オリジナルImage</param>
/// <param name="verticalNum">分割数(垂直)</param>
/// <param name="horizontalNum">分割数(水平)</param>
/// <returns>分割済Image</returns>
/// <remarks></remarks>
public static Image[][] DivideImage(
    Image originalImage, int verticalNum, int horizontalNum)
{
    
    //引数チェック
    if (originalImage == null) {
        throw new ArgumentNullException("originalImage is null");
    }
    
    if (verticalNum < 1) {
        throw new ArgumentOutOfRangeException("verticalNum < 1");
    }
    
    if (horizontalNum < 1) {
        throw new ArgumentOutOfRangeException("horizontalNum < 1");
    }
    
    Graphics g = null;
    
    Image[][] rtnImage = new Image[verticalNum][];
    for (int i = 0; i <= verticalNum - 1; i++) {
        rtnImage(i) = new Image[horizontalNum];
    }
    
    Size originalSize = originalImage.Size;
    int divWidth = originalSize.Width / horizontalNum;
    int divHeight = originalSize.Height / verticalNum;
    
    for (int vCnt = 0; vCnt < verticalNum ; vCnt++) {
        for (int hCnt = 0; hCnt < horizontalNum ; hCnt++) {
            try {
                //空のImageを作成
                rtnImage(vCnt)(hCnt) = new Bitmap(divWidth, divHeight);
                //Imageを描画する為のGraphicsオブジェクトを作成
                g = System.Drawing.Graphics.FromImage(
                    rtnImage(vCnt)(hCnt));
                //オリジナルImageから描画対象の領域を算出
                //[補足]
                // 領域の開始座標を
                // ・hCnt * divWidth
                // ・vCnt * divHeight
                // ではなく、
                // ・hCnt * originalSize.Width / horizontalNum
                // ・vCnt * originalSize.Height / verticalNum
                // にしているのは、誤差を軽減する為です。
                Rectangle rect = new Rectangle(
                     hCnt * originalSize.Width / horizontalNum, 
                     vCnt * originalSize.Height / verticalNum, 
                     divWidth, divHeight);
                //オリジナルImageの内容を描画
                g.DrawImage(
                    originalImage, 0, 0, 
                    rect, GraphicsUnit.Pixel);
            }
            finally {
                if (g != null) {
                    //Graphicsオブジェクトを解放
                    g.Dispose();
                }
            }
        }
    }
    
    return rtnImage;
}
[C#]Imageを分割する例

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。