【问题标题】:How to Convert bmp file to pcx file [closed]如何将 bmp 文件转换为 pcx 文件 [关闭]
【发布时间】:2014-01-28 21:58:04
【问题描述】:

有没有找到将图片格式bpm转pcx的方法或dll?

我一直在尝试遵循代码。

 public static void ConvertBMP2PCX(string bmpFilePath)
    {
        List<byte> listBytePCX = new List<byte>();

        Bitmap bmp = new Bitmap(bmpFilePath);
        int bmpWidth = bmp.Width;
        int bmpHeight = bmp.Height;

        byte[] byteBmp;
        using (MemoryStream ms = new MemoryStream())
        {
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            byteBmp = ms.ToArray();
            ms.Close();
        }

        int bytesPerLine = (bmpWidth + 7) / 8;
        int xEnd = bmpWidth - 1;
        int yEnd = bmpHeight - 1;

        byte[] header ={
        0x0A,           // "PCX File"
        0x05,           // "Version 5"
        0x01,           // RLE Encoding
        0x01,           // 1 bit per pixel
        0x00, 0x00,     // XStart at 0
        0x00, 0x00,     // YStart at 0
        (byte)(xEnd&0xFF), (byte)((xEnd>>8) & 0xFF),      // Xend
        (byte)(yEnd&0xFF), (byte)((yEnd>>8) & 0xFF),      // Yend
        (byte)(xEnd&0xFF), (byte)((xEnd>>8) & 0xFF),      // Xend
        (byte)(yEnd&0xFF), (byte)((yEnd>>8) & 0xFF),      // Yend
        0x0F, 0x0F, 0x0F, 0x0E, 0x0E, 0x0E, 0x0D, 0x0D, 0x0D, 0x0C, 0x0C, 0x0C,   //48-byte EGA palette info
        0x0B, 0x0B, 0x0B, 0x0A, 0x0A, 0x0A, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,  
        0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,  
        0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,  
        0x00,          // Reserved byte, always x00
        0x01,          // 1 bit plane
        (byte)(bytesPerLine&0xFF), (byte)((bytesPerLine>>8) & 0xFF),      // Bytes per scan line: (XEnd - XStart,  1) / 8
        0x01, 0x00,    // Palette type: 1 means color or monochrome
        0x00, 0x00,    // Horizontal screen size (not used)
        0x00, 0x00     // Vertical screen size (not used)
     };
        listBytePCX.AddRange(header); // Write most of header data
        listBytePCX.AddRange(new byte[54]);// pad the 128-byte header


        byte[] rowIn = new byte[bmpWidth * 3];
        int[] bits = { 128, 64, 32, 16, 8, 4, 2, 1 };

        byte[] bytes = new byte[2];
        int last = 0;
        int count = 0;
        for (int y = 0; y < bmpHeight; y++)
        {
            //getPixelRow(rowIn, y);
            int currentByteCount = (y + 1) * bytesPerLine;
            if (currentByteCount > byteBmp.Length)
            {
                currentByteCount = byteBmp.Length;
                rowIn = new byte[bmpWidth * 3];
            }

            for (int i = y * bytesPerLine; i < currentByteCount; i++)
            {
                rowIn[count] = byteBmp[i];
            }
            count = 0;

            for (int x = 0; x < bmpWidth; x += 8)
            {
                int n = x + 8;
                if (n > bmpWidth) n = bmpWidth;
                int b = 0;
                for (int j = x; j < n; j++)
                    if (rowIn[j + j + j] != 0)
                        b |= bits[j - x];
                if (last == b && count < 63)
                    count++;
                else
                {
                    if (count > 0)
                    {
                        bytes[0] = (byte)(count | 0xC0);
                        bytes[1] = (byte)last;
                        listBytePCX.Add(bytes[0]);
                        listBytePCX.Add(bytes[1]);
                    }
                    last = b;
                    count = 1;
                }
            }
            if (count > 0)
            {
                bytes[0] = (byte)(count | 0xC0);
                bytes[1] = (byte)last;
                listBytePCX.Add(bytes[0]);
                listBytePCX.Add(bytes[1]);
                count = 0;
                last = 0;
            }
        }

        //Save pcx file
        string pcxFilePath = bmpFilePath.Substring(0, bmpFilePath.LastIndexOf('.') + 1) + "1";
        using (FileStream fs = new FileStream(pcxFilePath, FileMode.Create, FileAccess.Write))
        {
            fs.Write(listBytePCX.ToArray(), 0, listBytePCX.Count);
            fs.Flush();
            fs.Close();
        }
    }

但它不起作用,只能用pcx格式创建细线。

【问题讨论】:

  • 不确定为什么包含完整代码的问题曾经被关闭,但代码中的问题是,将图像保存为 bmp 格式与从中提取实际数据字节完全不同。不过,您可以使用 LockBitsMarshal.Copy 来做到这一点。

标签: c# bmp pcx


【解决方案1】:

http://magick.codeplex.com/ 上有一个用于.NET 的ImageMagick 库的端口。该库支持 BMP 和 PCX 格式,还支持将图像从一种格式转换为另一种格式。

【讨论】:

  • 图书馆工作得很好。非常感谢!
  • 很高兴我能帮上忙。随意“接受”答案:) ...
  • @AndyFong 请您提供将 bmp 文件转换为 pcx 文件的代码。我正在使用 C# 开发一个 Windows 应用程序。任何想法!提前致谢
  • 您可以点击上面提供的链接magick.codeplex.com,打开标签文档。有一些示例代码。
猜你喜欢
  • 2011-04-27
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多