2012-08-31 24 views
3

我正在制作一个16位汇编程序,我工作的图形模式只支持每个像素写入单个字节的256种颜色。换句话说,我只能指定一个字节的颜色值来绘制一个像素。我将图像转换为8位深度位图,现在我试图用Visual Basic获取每个像素的颜色值,这样我就可以在汇编程序中使用这些值,但我得到的是RGB值,当我尝试将这些RGB值转换为单个字节我得到的数字大于256,因此我无法在图形模式下使用它。以下是我有:如何将与RGB相对应的3个字节转换为单个字节?

Dim myBitmap As New Bitmap("images.bmp") 
Dim output As New System.IO.StreamWriter("colors.txt", False) 
Dim pixelColor As Color 
Dim rgb As Integer 

For x As Integer = 1 To myBitmap.Width - 1 Step 1 
      pixelColor = myBitmap.GetPixel(x, y) 
      rgb = CUInt(pixelColor.B) + CUInt((pixelColor.G << 8)) + CUInt((pixelColor.R << 16)) 
      output.WriteLine(rgb.ToString) 

     Next x 

    Next y 
output.Close() 

,实际上是给我的线值大于256越高:

rgb = CUInt(pixelColor.B) + CUInt((pixelColor.G << 8)) + CUInt((pixelColor.R << 16)) 

有任何实际的方法来转换,合并或完全接近3个RGB值代入一个字节? (不能超过255个)



编辑: 既然我们已经进入VB网的东西让我写的代码工作符合逻辑变换大卫写道:

rgb = ((pixelColor.R/32) << 5) + ((pixelColor.G/32) << 2) + (pixelColor.B/64) 

谢谢大卫。

回答

5

3位用于红色值,3位用于绿色,2位用于蓝色。在维基百科页面上有关于8-bit color的解释很好。

的转换逻辑是:

[(Red/32) << 5] + [(Green/32) << 2] + (Blue/64) 
+0

这样一个快速的回答让我很难堪。过了几个小时,就是这样做了。呵呵。谢谢。 :) – NorthStyling

相关问题