c# - 将 2bpp 灰度图像转换为压缩字节数组
问题描述
有人可以告诉我将 2bpp 灰度图像转换为压缩字节数组时出了什么问题吗?压缩格式为 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)。
如果图像在 x 或 y 轴上小于 8 的幂,则将其余值默认为 0。
解决方案
推荐阅读
- c - linux系统错误,errno 21是什么意思
- java - 如何在 Spring JPA/Hibernate 中使用 JoinTable 设置仅通过 ID 引用父级的子实体
- sql - 如果有 3 条重复记录,则选择两条重复记录
- node.js - 没有沙箱的 Actions SDK 对话框 nodejs 事务 API 示例
- html - 消除视频加载后的页面跳转
- python - Python Selenium 点击按钮
- python - segyio > 如何解决 ImportError: DLL load failed: The specified module could not be found
- python - 从 Google Cloud Function 发出 POST 请求时 Python 超时
- tableau-api - 使用 Tableau API 检索嵌入式数据源的自定义 SQL
- c++ - VSCode 调试旧文件而不是当前文件