C# 24位到1位位图转换

C# 24位到1位位图转换,c#,bitmap,bytearray,C#,Bitmap,Bytearray,对于移动应用程序,我必须从24位位图生成1位位图。问题是,结果不正确,所以我做了这个小项目,在我的台式电脑上试用。创建工作正常,但结果不好,正如你所看到的 你几乎无法读取任何东西,因为很多位不再位于正确的位置,而是向左或向右移动了一些像素 这是我用于创建的代码: int z = 0; int bitNumber = 0; //the new 1Bit-byte-Array byte[] oneBitImage = new byte[(bmp.Height * bmp.Width) / 8];

对于移动应用程序,我必须从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);
intz=0;
整数位数=0;
//新的1位字节数组
字节[]oneBitImage=新字节[(bmp.Height*bmp.Width)/8];
BitmapData bmData=bmp.LockBits(新矩形(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
不安全的
{
byte*p=(byte*)(void*)bmData.Scan0.ToPointer();
int stopAddress=(int)p+bmp.Height*bmData.Stride;
while((int)p!=stopAddress)
{
如果(*p<128)//为黑色
OneBITMAGE[z]=(字节)(OneBITMAGE[z]| Exp(位号));//在指定位置设置一位
p+=3;
比特数++;
如果(位号==8)
{
比特数=0;
z++;
}
}
}
bmp.解锁位(bmData);
//转换为1位bmp以检查结果
位图newbmp=新位图(bmp.Width、bmp.Height、PixelFormat.format1bpindexed);
BitmapData bmpData=newbmp.LockBits(
新矩形(0,0,新矩形宽度,新矩形高度),
ImageLockMode.WriteOnly,newbmp.PixelFormat);
Marshal.Copy(onebitmage,0,bmpData.Scan0,onebitmage.Length);
newbmp.解锁位(bmpData);
保存(文件名,ImageFormat.Bmp);
简要说明: 我每三个字节运行一次,如果这个字节——一个3字节组的第一个字节(24位的像素)——小于128,我会在指定的位置放一位。
EXP给我指数…

在每个输出字节中切换位。第7位应该是第0位,等等。

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

谢谢你,先生,你太棒了-我花了好几个小时寻找这个巨大的错误,尝试了所有方法,但我愚蠢地发现了这个错误。对我来说,你告诉我。。。我欠你一个人情——真诚的卡洛。但你知道,亚历克斯也是对的;不要只考虑蓝色通道的价值,还要考虑其他通道。是的,但我自己创建的24位图像只有黑色和白色,这使得没有必要检查其他通道并再进行两次比较……我部分同意。这不是图像移位的原因,但在转换为1bpp图像时,我确实会考虑所有三个颜色字节。如果它的颜色八位字节中的任何一个比FF更接近00,我会倾向于认为一个像素是黑色的。但是,这不是像素偏移的问题,你是对的。我没有充分考虑移位位的问题。将三个字节转换成一种颜色是我的第一个想法