Comment convertir un fichier bmp en fichier pcx [fermé]
Question
Une méthode ou une DLL trouvée pour convertir le format d'image bpm en pcx ?
J'ai essayé de suivre le code.
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();
}
}
Mais cela ne fonctionne pas, créez simplement une fine ligne au format pcx.
La solution
Il y a un port du ImageMagick bibliothèque pour .NET sur http://magick.codeplex.com/.La bibliothèque prend en charge à la fois les formats BMP et PCX et convertit également les images d'un format à un autre.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow