投稿者 mayopee  (社会人) 投稿日時 2020/6/25 18:08:02
Stride は、4バイト境界に切り上げられるようで、上のBitmapSource=> Bitmapの変換で
間違いがあったので、訂正しておきます。
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.imaging.bitmapdata.stride?view=dotnet-plat-ext-3.1

<Runtime.CompilerServices.Extension>
    Public Function ToBitmap(ByVal bitmapSource As BitmapSource, ByVal pixelFormat As Imaging.PixelFormat) As Bitmap
        Dim width As Integer = bitmapSource.PixelWidth
        Dim height As Integer = bitmapSource.PixelHeight
        Dim stride As Integer = ((width * bitmapSource.Format.BitsPerPixel + 31) \ 32) * 4
        Dim ptr As IntPtr = IntPtr.Zero
        Try
            ptr = Marshal.AllocCoTaskMem(height * stride)
            bitmapSource.CopyPixels(New Windows.Int32Rect(0, 0, width, height), ptr, height * stride, stride)
            Using bitmap = New Bitmap(width, height, stride, pixelFormat, ptr)
                Return New Bitmap(bitmap)
            End Using
        Finally
            If ptr <> IntPtr.Zero Then Marshal.FreeCoTaskMem(ptr)
        End Try
    End Function