Может кто-нибудь сказать мне, что не так при преобразовании 2-битного изображения в градациях серого в сжатый байтовый массив?сжатый формат будет W * H * Color.
в настоящее время я беру это изображение ..
, пропуская его через это ..
public byte[] ToBytes(ImageData imageData)
{
byte imageDepth = 4;
int imageWMin = imageData.GetWidth();
int imageHMin = imageData.GetHeight();
int imageWMax = (int)Math.Ceiling((double)imageData.GetWidth() / 16) * 16;
int imageHMax = (int)Math.Ceiling((double)imageData.GetHeight() / 16) * 16;
int byteCount = ((imageWMax + imageHMax * imageWMax) * imageDepth) / 256;
byte[] data = new byte[byteCount];
//Loop though tiles
for (int ty = 0; ty < imageHMax/8; ty++)
for (int tx = 0; tx < imageWMax/8; tx++)
{
//Loop through pixels
for (int py = 0; py < 8; py++)
for (int px = 0; px < 8; px++)
{
int pixelX = tx + px;
int pixelY = ty + py;
int pixelColor = 0;
int pixelByte = ((pixelX + pixelY * imageWMax) * imageDepth) / 256;
if (pixelX < imageWMin && pixelY < imageHMin)
pixelColor = Math.Min((imageData.GetPixel(pixelX, pixelY).intValue0 / 64), 3);
Console.WriteLine("{ " + pixelX.ToString() + ", " + pixelY.ToString() + " } = " + pixelColor.ToString() + " at byte: " + pixelByte.ToString());
data[pixelByte] = (byte)((data[pixelByte] & ~(byte)0x4) | ((byte)pixelColor & (byte)0x4));
}
}
return data;
}
public override void Load() //runs on boot
{
imageData = Image.NewImageData("test.png");
image = Graphics.NewImage(imageData);
image.SetFilter(FilterMode.Nearest, FilterMode.Nearest, 1);
bytes = ToBytes(imageData);
Console.WriteLine("saving to " + AppDomain.CurrentDomain.BaseDirectory + "test.txt");
if (!System.IO.File.Exists(AppDomain.CurrentDomain.BaseDirectory + "test.txt")) Console.WriteLine("file: " + AppDomain.CurrentDomain.BaseDirectory + "test.txt does not exist!");
System.IO.File.WriteAllBytes(AppDomain.CurrentDomain.BaseDirectory+"test.txt", bytes);
}
static void Main(string[] arg)
{
Boot.Run(new Test2BPP());
}
и получить декодированный двоичный вывод как этот ..
04 04 00 00
, который, как я предполагаю, должен быть 2 байта вместо 4, потому что 16 * 8 * 4 = 512или целочисленное значение 2 байта
, чтобы было ясно, я хочу сохранить каждую 8x8 часть изображения сверху вниз слева направо в виде байта или 2 бит на пиксель (TILEWIDTH * TILEHEIGHT * COLORSPERPIXEL).
если изображение меньше степени 8 на оси x или y, то по умолчанию оставшиеся значения равны 0.