Domanda

Qualche metodo o DLL trovato per convertire il formato immagine bpm in pcx?

Ho provato a seguire il codice.

 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();
        }
    }

Ma non funziona, crea solo una linea sottile con il formato pcx.

È stato utile?

Soluzione

C'è un porto del ImageMagick libreria per .NET su http://magick.codeplex.com/.La libreria supporta sia il formato BMP che PCX e anche la conversione di immagini da un formato all'altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top