2014-01-10 79 views
1

任何發現將圖像格式bpm轉換爲pcx的方法或dll?如何將bmp文件轉換爲pcx文件

我一直在嘗試遵循代碼。

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格式創建一條細線。

回答

1

有一個用於.NET的ImageMagick庫的端口,位於http://magick.codeplex.com/。該庫支持BMP和PCX格式,也可以將圖像從一種格式轉換爲另一種格式。

+0

該圖書館工作eazy和罰款。非常感謝! –

+0

很高興我能幫到你。隨意「接受」的答案:) ... – MartinStettner

+0

@AndyFong請你可以提供我的代碼轉換成pcx文件的BMP文件..我正在開發一個Windows應用程序使用C#..任何想法!在此先感謝 – 2014-10-08 01:27:07