我正在用C#创建一个WinForm应用程序,我可以用来“嗅出”文件中的一些24位位图。我已经收集了一些信息,例如它的偏移量,一些关于它如何写入文件的分析,以及它的长度。
有关该文件的更多信息是:
我正在使用以下代码:
using (FileStream fs = new FileStream(@"E:\MyFile.exe", FileMode.Open))
{
int width = 190;
int height = 219;
int StartOffset = 333333; // Just a sample offset
Bitmap tmp_bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Rectangle rect = new Rectangle(0, 0, tmp_bitmap.Width, tmp_bitmap.Height);
System.Drawing.Imaging.BitmapData bmpData =
tmp_bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
tmp_bitmap.PixelFormat);
unsafe
{
// Get address of first pixel on bitmap.
byte* ptr = (byte*)bmpData.Scan0;
int bytes = width * height * 3; //124830 [Total Length from 190x219 24 Bit Bitmap]
int b; // Individual Byte
for (int i = 0; i < bytes; i++)
{
fs.Position = StartOffset - i; // Change the fs' Position [Subtract since I'm reading in reverse]
b = fs.ReadByte(); // Reads one byte from its position
*ptr = Convert.ToByte(b); // Record byte
ptr ++;
}
// Unlock the bits.
tmp_bitmap.UnlockBits(bmpData);
}
pictureBox1.Image = tmp_bitmap;
}
我得到了这个输出。我认为原因是每当它到达下一行时,字节就会变得混乱。 (255 0 255变为0 255 255并继续直到它变为255 255 0)
我希望你能帮我解决这个问题。非常感谢你提前。
解 现在通过添加此代码(在我的朋友的帮助下和James Holderness提供的信息)来修复它
if (width % 4 != 0)
if ((i + 1) % (width * 3) == 0 && (i + 1) * 3 % width < width - 1)
ptr += 2;
非常感谢!
答案 0 :(得分:4)
对于标准BMP,每个单独的扫描线需要是4个字节的倍数,因此当您有24位图像(每个像素3个字节)时,通常需要在每个扫描线的末尾允许填充把它提高到4的倍数。
例如,如果您的宽度为150像素,即450字节,则需要将其四舍五入为452,使其为4的倍数。
我怀疑这可能是你在这里遇到的问题。