对于移动应用程序,我必须从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给了我指数......
答案 0 :(得分:2)
切换每个输出字节中的位。第7位应为0位,等等。
答案 1 :(得分:1)
我会将三个字节转换为“真实”颜色(长值或类似值)并查看结果是否大于16.7米的一半。