代码之家  ›  专栏  ›  技术社区  ›  user2719109

将32位图像转换为黑白两色图像时出现问题

  •  1
  • user2719109  · 技术社区  · 11 年前

    我有以下代码例程。。。

    Public Shared Sub ConvertToBitonal(ByRef Source As System.Windows.Media.Imaging.WriteableBitmap)
        If Source.Format = System.Windows.Media.PixelFormats.BlackWhite Then
            Exit Sub
        End If
    
        Dim BytesPerPixel As Integer = (Source.Format.BitsPerPixel + 7) / 8
        Dim Stride As Integer = Source.PixelWidth * BytesPerPixel
        Dim NumBytes As Long = Source.PixelHeight * Stride
        Dim pixels As Byte() = New Byte(NumBytes - 1) {}
    
        Source.CopyPixels(pixels, Stride, 0)
    
        For cnt As Integer = 0 To pixels.Length - 1 Step BytesPerPixel
            Dim blue As Byte = pixels(cnt + 0)
            Dim green As Byte = pixels(cnt + 1)
            Dim red As Byte = pixels(cnt + 2)
            Dim intensity As Integer = CType(red, Integer) + CType(green, Integer) + CType(blue, Integer)
            Dim targetColor As Byte
    
            If intensity > 400 Then
                targetColor = 255
            Else
                targetColor = 0
            End If
    
            pixels(cnt + 0) = targetColor
            pixels(cnt + 1) = targetColor
            pixels(cnt + 2) = targetColor
            pixels(cnt + 3) = targetColor
        Next
    
        Source.WritePixels(New System.Windows.Int32Rect(0, 0, Source.PixelWidth, Source.PixelHeight), pixels, Stride, 0)
    End Sub
    

    当源图像是每像素24位时,输出完全符合我的要求,但当源图像为32位时,颜色就不稳定了,我得到了贯穿图像的垂直线。有人能告诉我如何修改例程,使32位图像像24位计数器部件一样显示出来吗?

    这是我所说内容的屏幕截图。。。(显然我还没有足够的代表来发布图片,所以这里有一个链接

    enter image description here

    2 回复  |  直到 11 年前
        1
  •  0
  •   Community gkalpak    7 年前

    您可能需要先创建一个24bpp的映像副本。你试过了吗?

    我很久以前也做过类似的事情(很久以前想不起细节了),这篇文章很有帮助: Bitonal conversion issues 。MSDN论坛上也有一些信息。

    编辑: seen this entry?

        2
  •  0
  •   Martin Tournoij ravi.zombie    8 年前

    我仔细研究了代码,发现了问题:

    Dim BytesPerPixel As Integer = (Source.Format.BitsPerPixel + 7) / 8
    

    移除 + 7 .

    同时更改此项:

        pixels(cnt + 0) = targetColor
    
        pixels(cnt + 1) = targetColor
    
        pixels(cnt + 2) = targetColor
    
        pixels(cnt + 3) = targetColor
    

    到包含步骤的FOR循环。。。。。即。:

            Dim x%
    
            For x = cnt To cnt + BytesPerPixel - 1
    
                pixels(x) = targetColor
    
            Next
    

    如果步骤是>4,它不会设置值,会给你这个向下的条。