문제
이미지 형식 bpm을 pcx로 변환하는 방법이나 dll이 있습니까?
나는 다음 코드를 시도했습니다.
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 형식으로 얇은 선만 만듭니다.
해결책
항구가 있습니다. 이미지매직 .NET용 라이브러리 http://magick.codeplex.com/.라이브러리는 BMP와 PCX 형식을 모두 지원하며 이미지를 한 형식에서 다른 형식으로 변환합니다.
제휴하지 않습니다 StackOverflow