Конвертируйте 2-пиксельное изображение в градациях серого в сжатый байтовый массив - PullRequest
0 голосов
/ 12 декабря 2018

Может кто-нибудь сказать мне, что не так при преобразовании 2-битного изображения в градациях серого в сжатый байтовый массив?сжатый формат будет W * H * Color.

в настоящее время я беру это изображение .. enter image description here

, пропуская его через это ..

  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.

...