【问题标题】:BMP 16-bit Image converting into arrayBMP 16 位图像转换为数组
【发布时间】:2013-07-25 09:06:11
【问题描述】:

我有一个BMP格式的图片,按以下方式存档

  for (j = 0; j < 240; j++) {
    for(i=0;i<320;i++) { 
      data_temp = LCD_ReadRAM();
      image_buf[i*2+1] = (data_temp&0xff00) >> 8;
      image_buf[i*2+0] = data_temp & 0x00ff;

    }
    ret = f_write(&file, image_buf, 640, &bw);

LCD_ReadRam 函数从 LCD 屏幕一次读取一个像素

我想知道,我如何获取此图像文件的像素位置。 以及如何将每个像素的值保存在 [320][240] 矩阵中
任何帮助将不胜感激,谢谢。

【问题讨论】:

  • “获取像素位置”是什么意思?你不能只使用ij 作为你的X 和Y(分别)吗?
  • 不看LCD_Read_RAM()很难回答。然而,通常在这种类型的应用程序中,像素值是从左上到右返回的。假设这是正确的,您可以将像素值分配给内部循环 img[i][j] = data_temp; 内的二维数组。
  • bmp 保存为 corect 。它可以在电脑上查看.. 我想要一个完全相反的功能

标签: c image bmp lcd


【解决方案1】:

BMP 文件阅读器可以满足您的需求。您可以获得任何好的 BMP 文件阅读器并根据您的目的对其进行调整。例如:this question and answer 提供了一个假定 24 位 BMP 格式的 BMP 文件阅读器。您的格式是 16 位的,因此需要进行一些调整。

这是我的尝试(没有测试,所以你应该对硬编码的细节持保留态度)。

int i;
FILE* f = fopen(filename, "rb");
unsigned char info[54];
fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header

int width = 320, height = 240; // might want to extract that info from BMP header instead

int size_in_file = 2 * width * height;
unsigned char* data_from_file = new unsigned char[size_in_file];
fread(data_from_file, sizeof(unsigned char), size_in_file, f); // read the rest
fclose(f);

unsigned char pixels[240 * 320][3];

for(i = 0; i < width * height; ++i)
{
    unsigned char temp0 = data_from_file[i * 2 + 0];
    unsigned char temp1 = data_from_file[i * 2 + 1];
    unsigned pixel_data = temp1 << 8 | temp0;

    // Extract red, green and blue components from the 16 bits
    pixels[i][0] = pixel_data >> 11;
    pixels[i][1] = (pixel_data >> 5) & 0x3f;
    pixels[i][2] = pixel_data & 0x1f;
}

注意:这假设您的 LCD_ReadRAM 函数(可能是从您的 LCD 内存中读取内容)提供标准 5-6-5 格式的像素。

名称 5-6-5 表示为每个颜色分量(红、绿、蓝)分配的每个 16 位数中的位数。还有其他分配,例如5-5-5,但我在实践中从未见过。

【讨论】:

  • LCD_ReadRAM 函数只是返回 LCD_Data;其中 LCD_Data 是对 (*(vu16 *)LCD_BASE_Data) 的定义,LCD_BASE_Addr 是对 ((u32)(0x60000000|0x00000000)) 的定义
【解决方案2】:

如果你说的是 BMP 图像,那么有现有的BMP format

BMP 图像中,所有像素都以相反的顺序(从图像中的最后一行开始)顺序写入。大小在 BMP 标头中定义,因此您必须阅读它。

还有一点是,图像中的每一行都有填充,以使其乘以 4。

【讨论】:

    【解决方案3】:

    您可以使用 gimp。在gimp中打开图片,使用a plugin以16位模式导出C代码,并在导出的C代码中放入数组中:-)。

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 2015-05-02
      • 2014-08-18
      相关资源
      最近更新 更多