title: How to Convert bmp file to pcx file
body: <p>Any method or dll found to convert the image format bpm to pcx?</p>
  
  <p>I have been trying to following code.</p>
  
  <pre><code> public static void ConvertBMP2PCX(string bmpFilePath)
      {
          List&lt;byte&gt; listBytePCX = new List&lt;byte&gt;();
  
          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&amp;0xFF), (byte)((xEnd&gt;&gt;8) &amp; 0xFF),      // Xend
          (byte)(yEnd&amp;0xFF), (byte)((yEnd&gt;&gt;8) &amp; 0xFF),      // Yend
          (byte)(xEnd&amp;0xFF), (byte)((xEnd&gt;&gt;8) &amp; 0xFF),      // Xend
          (byte)(yEnd&amp;0xFF), (byte)((yEnd&gt;&gt;8) &amp; 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&amp;0xFF), (byte)((bytesPerLine&gt;&gt;8) &amp; 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 &lt; bmpHeight; y++)
          {
              //getPixelRow(rowIn, y);
              int currentByteCount = (y + 1) * bytesPerLine;
              if (currentByteCount &gt; byteBmp.Length)
              {
                  currentByteCount = byteBmp.Length;
                  rowIn = new byte[bmpWidth * 3];
              }
  
              for (int i = y * bytesPerLine; i &lt; currentByteCount; i++)
              {
                  rowIn[count] = byteBmp[i];
              }
              count = 0;
  
              for (int x = 0; x &lt; bmpWidth; x += 8)
              {
                  int n = x + 8;
                  if (n &gt; bmpWidth) n = bmpWidth;
                  int b = 0;
                  for (int j = x; j &lt; n; j++)
                      if (rowIn[j + j + j] != 0)
                          b |= bits[j - x];
                  if (last == b &amp;&amp; count &lt; 63)
                      count++;
                  else
                  {
                      if (count &gt; 0)
                      {
                          bytes[0] = (byte)(count | 0xC0);
                          bytes[1] = (byte)last;
                          listBytePCX.Add(bytes[0]);
                          listBytePCX.Add(bytes[1]);
                      }
                      last = b;
                      count = 1;
                  }
              }
              if (count &gt; 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();
          }
      }
  </code></pre>
  
  <p>But it doesn't work,only create a thin line with pcx format.</p>