2014-01-10 2 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

http://magick.codeplex.com/에는 .NET 용 ImageMagick 라이브러리 포트가 있습니다. 라이브러리는 BMP와 PCX 형식을 모두 지원하며 한 형식에서 다른 형식으로 이미지를 변환합니다.

+0

라이브러리는 아주 잘 작동합니다. 고마워요! –

+0

기꺼이 도와 드리겠습니다. "대답"을 받아 들일 자유를 느껴보십시오 :) ... – MartinStettner

+0

@AndyFong 제발 내가 pcx 파일로 bmp 파일을 변환하는 코드를 제공 할 수 있습니다 .. 나는 C#을 사용하여 Windows 응용 프로그램을 개발 중입니다 .. 어떤 아이디어 !! 미리 감사드립니다. –

관련 문제