2012-01-11 163 views
1

对于移动应用程序,我必须从24位位图中生成1位位图。问题是,结果不正确,所以我让这个小项目在我的台式机上试用。正如你所看到的那样,创作是有效的,但结果并不好。24位到1位位图转换

你几乎不能读任何东西,因为很多位不在正确的位置,而是向左或向右移动了一些像素。

这是我使用用于创建的代码:

int z = 0; 
int bitNumber = 0; 
//the new 1Bit-byte-Array 
byte[] oneBitImage = new byte[(bmp.Height * bmp.Width)/8]; 

BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
unsafe 
{ 
    byte* p = (byte*)(void*)bmData.Scan0.ToPointer(); 
    int stopAddress = (int)p + bmp.Height * bmData.Stride; 
    while ((int)p != stopAddress) 
    { 
    if (*p < 128) // is black 
    oneBitImage[z] = (byte)(oneBitImage[z] | Exp(bitNumber)); //Set a Bit on the specified position 
    p += 3; 

    bitNumber++; 

    if (bitNumber == 8) 
    { 
     bitNumber = 0; 
     z++; 
    } 
    } 
} 

bmp.UnlockBits(bmData); 

//Convert into 1-bit-bmp to check result 
Bitmap newbmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format1bppIndexed); 

BitmapData bmpData = newbmp.LockBits(
          new Rectangle(0, 0, newbmp.Width, newbmp.Height), 
          ImageLockMode.WriteOnly, newbmp.PixelFormat); 

Marshal.Copy(oneBitImage, 0, bmpData.Scan0, oneBitImage.Length); 

newbmp.UnlockBits(bmpData); 

newbmp.Save(fileName, ImageFormat.Bmp); 

简短说明: 我通过每一个第三字节运行,如果该字节 - 3字节组中的第一个(24像素 - 低于128我在指定的位置放了一些。 EXP给我指数...

回答

2

切换每个输出字节周围的位。位7应该是位0等。

+0

谢谢主席先生,你太棒了 - 我几个小时寻找这个f **国王的错误,尝试了一切,但我却愚蠢地想出了这件事。对我来说,现在看来很合理,你告诉我......我欠你一个 - 真诚卡尔 – Karl 2012-01-11 15:08:20

+0

好的。但是AlexS也是对的,你知道;不要只考虑蓝色通道的价值,但也要考虑其他通道。 – 2012-01-11 15:12:40

+0

是的,但我自己创建的24位图像只有黑色和白色,这使得没有必要检查其他人,并做两个更多的比较... – Karl 2012-01-11 15:17:53

1

我会将三个字节转换为“真实”颜色(长值或类似值)并查看结果是否大于16.7m的一半。

+0

我同意部分。这不是为什么图像被移位,但是当转换为1 bpp图像时,我确实会考虑所有三个颜色字节。如果任何颜色八位字节比FF更接近00,我倾向于认为像素是黑色的。但是,这不是像素转换问题。 – tcarvin 2012-01-11 15:11:03

+0

你说得对。我对转移位的问题没有足够的认识。我的第一个想法是将三个字节转换成一种颜色 – AlexS 2012-01-11 16:04:10