我在C#中有一个PCX解码器(见下文),它意味着在Stream中读取并输出一个Bitmap。它在处理尺寸为8的倍数的图像时起作用,并且似乎适用于大多数小于8bpp的图像而不管尺寸如何,但具有不同尺寸的图像以不寻常的方式变得偏斜(参见this link )。像素都在那里,只是它似乎几乎以一种奇怪的方式向左移动。该图像是有效的PCX,可在IrfanView和Paint.net中打开。
编辑1:
好的,这是相当多的测试结果:每行字节数除以8(例如316x256)的图像解码很好,但奇数值的图像则没有。并非所有PCX文件都适用;似乎在IrfanView中创建的一些(大多数?)图像工作正常,但我在其他地方找到的图像却没有。我前段时间正在研究这个问题,所以我不记得它们来自哪里,我知道用paint.net插件保存的图像(here)也会重现这个问题。我认为这可能是由于填充问题,无论是使用它们还是我的解码器,但是其他地方的图像要解码得很好,所以很可能我是那个有问题的人,我只是看不到:(
编辑结束1。
我的导入代码在这里(有很多,但它是整个解码算法,减去标题,单独处理):
public IntPtr ReadPixels(Int32 BytesPerScanline, Int32 ScanLines, Stream file)
{
//BytesPerScanLine is the taken from the header, ScanLines is the height and file is the filestream
IntPtr pBits;
Boolean bRepeat;
Int32 RepeatCount;
Byte ReadByte;
Int32 Row = 0;
Int32 Col = 0;
Byte[] PCXData = new Byte[BytesPerScanline * ScanLines]; //BytesPerScanline * ScanLines);
BinaryReader r = new BinaryReader(file);
r.BaseStream.Seek(128, SeekOrigin.Begin);
while (Row < ScanLines)
{
ReadByte = r.ReadByte();
bRepeat = (0xc0 == (ReadByte & 0xC0));
RepeatCount = (ReadByte & 0x3f);
if (!(Col >= BytesPerScanline))
{
if (bRepeat)
{
ReadByte = r.ReadByte();
while (RepeatCount > 0)
{
PCXData[(Row * BytesPerScanline) + Col] = ReadByte;
RepeatCount -= 1;
Col += 1;
}
}
else
{
PCXData[(Row * BytesPerScanline) + Col] = ReadByte;
Col += 1;
}
}
if (Col >= BytesPerScanline)
{
Col = 0;
Row += 1;
}
}
pBits = System.Runtime.InteropServices.Marshal.AllocHGlobal(PCXData.Length);
System.Runtime.InteropServices.Marshal.Copy(PCXData, 0, pBits, PCXData.Length);
return pBits;
}
我被告知这可能是填充的一个问题,但我无法看到代码中的位置,我很难看到如何理解填充的位置。