1

找到将图像格式 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 格式创建一条细线。

4

1 回答 1

1

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

于 2014-01-10T03:45:07.937 回答