質問
画像形式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形式で細い線を作成するだけです。
解決
港があるのは、2009年に開業した ImageMagick NET用ライブラリ http://magick.codeplex.com/.ライブラリは、BMPとPCX形式の両方をサポートしており、画像をある形式から別の形式に変換することもできます。
所属していません StackOverflow