在PCX解码器中填充

时间:2011-12-04 15:46:27

标签: c# image image-processing

我在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;
    }

我被告知这可能是填充的一个问题,但我无法看到代码中的位置,我很难看到如何理解填充的位置。

0 个答案:

没有答案