2014-01-10 2 views
1

Любой метод или dll, найденный для преобразования формата изображения bpm в pcx?Как преобразовать файл 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

Существует порт библиотеки ImageMagick для .NET на http://magick.codeplex.com/. Библиотека поддерживает формат BMP и PCX, а также конвертирует изображения из одного формата в другой.

+0

В библиотеке работает eazy и прекрасно. Большое спасибо! –

+0

Рад, что я мог помочь. Не стесняйтесь «принять» ответ :) ... – MartinStettner

+0

@ AndyFong, пожалуйста, вы можете предоставить мне код для преобразования BMP-файла в файл pcx. Я разрабатываю приложение для Windows с помощью C# .. любые идеи !! заранее спасибо –

Смежные вопросы