DOBON.NETプログラミング道掲示板

■34180 / 2階層)  PIctureBox同士を論理合成したい
□投稿者/ HIROPON 一般人(2回)-(2019/03/02(Sat) 18:48:03)
  • アイコンご提示のサンプルを元に以下のようなメソッドを作ってみました。
    ------------------------------------------------------------
    Public Sub AddCopy(ByVal Srcimg As Bitmap, ByVal Desimg As Bitmap)

    '1ピクセルあたりのバイト数を取得する
    Dim SrcpixelFormat As PixelFormat = Srcimg.PixelFormat
    Dim SrcpixelSize As Integer = Image.GetPixelFormatSize(SrcpixelFormat) / 8
    If SrcpixelSize < 3 OrElse 4 < SrcpixelSize Then
    Throw New ArgumentException(
    "1ピクセルあたり24または32ビットの形式のイメージのみ有効です。",
    "Srcimg")
    End If

    Dim DespixelFormat As PixelFormat = Desimg.PixelFormat
    Dim DespixelSize As Integer = Image.GetPixelFormatSize(DespixelFormat) / 8
    If DespixelSize < 3 OrElse 4 < DespixelSize Then
    Throw New ArgumentException(
    "1ピクセルあたり24または32ビットの形式のイメージのみ有効です。",
    "Desimg")
    End If

    'Bitmapをロックする
    Dim SrcbmpDate As BitmapData =
    Srcimg.LockBits(New Rectangle(0, 0, Srcimg.Width, Srcimg.Height),
    ImageLockMode.ReadWrite, Srcimg.PixelFormat)

    If SrcbmpDate.Stride < 0 Then
    Srcimg.UnlockBits(SrcbmpDate)
    Throw New ArgumentException(
    "ボトムアップ形式のイメージには対応していません。",
    "Srcimg")
    End If

    Dim DesbmpDate As BitmapData =
    Desimg.LockBits(New Rectangle(0, 0, Desimg.Width, Desimg.Height),
    ImageLockMode.ReadWrite, Desimg.PixelFormat)

    If DesbmpDate.Stride < 0 Then
    Desimg.UnlockBits(DesbmpDate)
    Throw New ArgumentException(
    "ボトムアップ形式のイメージには対応していません。",
    "Desimg")
    End If

    'ピクセルデータをバイト型配列で取得する
    Dim Srcptr As IntPtr = SrcbmpDate.Scan0
    Dim Srcpixels As Byte() = New Byte(SrcbmpDate.Stride * Srcimg.Height - 1) {}
    System.Runtime.InteropServices.Marshal.Copy(Srcptr, Srcpixels, 0, Srcpixels.Length)

    Dim Desptr As IntPtr = DesbmpDate.Scan0
    Dim Despixels As Byte() = New Byte(DesbmpDate.Stride * Desimg.Height - 1) {}
    System.Runtime.InteropServices.Marshal.Copy(Desptr, Despixels, 0, Despixels.Length)

    'すべてのピクセルの色を補正する
    For y As Integer = 0 To SrcbmpDate.Height - 1
    For x As Integer = 0 To SrcbmpDate.Width - 1
    'ピクセルデータでのピクセル(x,y)の開始位置を計算する
    Dim Srcpos As Integer = y * SrcbmpDate.Stride + x * SrcpixelSize
    Dim Despos As Integer = y * DesbmpDate.Stride + x * DespixelSize

    '新しい色を計算する
    Dim SrcnewR As Integer = Srcpixels(Srcpos + 2)
    Dim SrcnewG As Integer = Srcpixels(Srcpos + 1)
    Dim SrcnewB As Integer = Srcpixels(Srcpos + 0)

    Dim DesnewR As Integer = Despixels(Despos + 2)
    Dim DesnewG As Integer = Despixels(Despos + 1)
    Dim DesnewB As Integer = Despixels(Despos + 0)

    Dim newR As Integer = SrcnewR And DesnewR
    Dim newG As Integer = SrcnewG And DesnewG
    Dim newB As Integer = SrcnewB And DesnewB

    '色を変更する
    Despixels(Srcpos + 2) = CByte(newR)
    Despixels(Srcpos + 1) = CByte(newG)
    Despixels(Srcpos) = CByte(newB)
    Next
    Next

    'ピクセルデータを元に戻す
    System.Runtime.InteropServices.Marshal.Copy(Despixels, 0, Desptr, Despixels.Length)

    'ロックを解除する
    Srcimg.UnlockBits(SrcbmpDate)
    Desimg.UnlockBits(DesbmpDate)

    End Sub
    ------------------------------------------------------------------------
    どうにか思い通りの結果が得られました。
    ありがとうございます。

違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: PIctureBox同士を論理合成したい /魔界の仮面弁士 →Re[3]: PIctureBox同士を論理合成したい /HIROPON
 
上記関連ツリー

Nomalアイコン PIctureBox同士を論理合成したい / HIROPON (19/03/01(Fri) 22:07) #34177
Nomalアイコン Re[1]: PIctureBox同士を論理合成したい / 魔界の仮面弁士 (19/03/01(Fri) 22:14) #34179
  └Nomalアイコン PIctureBox同士を論理合成したい / HIROPON (19/03/02(Sat) 18:48) #34180 ←Now
    └Nomalアイコン Re[3]: PIctureBox同士を論理合成したい / HIROPON (19/03/08(Fri) 22:32) #34191 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -