码迷,mamicode.com
首页 > 其他好文 > 详细

8位灰度图在LCD上显示

时间:2014-07-23 14:49:06      阅读:769      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

一、概述

1、灰度

  灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像。每个灰度对象都具有从 0%(白色)到灰度条100%(黑色)的亮度值。 使用黑白或灰度扫描仪生成的图像通常以灰度显示。

  像素值量化后用一个字节(8 bits)来表示。如把有黑-灰-白连续变化的灰度值量化为256个灰度级,灰度值的范围为0~255,表示亮度从深到浅,对应图像中的颜色为从黑到白。黑白照片包含了黑白之间的所有的灰度色调,每个像素值都是介于黑色和白色之间的256种灰度中的一种。

2、灰度图bmp文件格式

                 

偏移量

域的名称

大小

内容

 

 

 

图像文件头

0000h

标识符(Identifier)

2 bytes

两字节的内容用来识别位图的类型:

BM : Windows 3.1x, 95, NT, 

BA :OS/2 Bitmap Array

CI :OS/2 Color Icon

CP :OS/2 Color Pointer

IC : OS/2 Icon

PT :OS/2 Pointer 

 

0002h

File Size

1 dword

用字节表示的整个文件的大小

 

0006h

Reserved

1 dword

保留,设置为0

 

000Ah

Bitmap Data Offset

1 dword

从文件开始到位图数据开始之间的数据

(bitmap data)之间的偏移量

 

000Eh

Bitmap Header Size

1 dword

位图信息头(Bitmap Info Header)的长度,用来描述

位图的颜色、压缩方法等。下面的长度表示:

28h - Windows 3.1x, 95, NT,

0Ch - OS/2 1.x

F0h - OS/2 2.x

 

0012h

Width

1 dword

位图的宽度,以像素为单位

 

0016h

Height

1 dword

位图的高度,以像素为单位

 

001Ah

Planes

1 word

位图的位面数


图像信息头

 

 

001Ch

Bits Per Pixel

1 word

每个像素的位数

1 - Monochrome bitmap

4 - 16 color bitmap

8 - 256 color bitmap

16 - 16bit (high color) bitmap

24 - 24bit (true color) bitmap

32 - 32bit (true color) bitmap

 

001Eh

Compression

1 dword

压缩说明:

0 - none (也使用BI_RGB表示)

1 - RLE 8-bit / pixel (也使用BI_RLE4表示)

2 - RLE 4-bit / pixel (也使用BI_RLE8表示)

3 - Bitfields (也使用BI_BITFIELDS表示)

 

0022h

Bitmap Data Size

1 dword

用字节数表示的位图数据的大小。该数必须是4的倍数

 

0026h

HResolution

1 dword

用像素/米表示的水平分辨率

 

002Ah

VResolution

1 dword

用像素/米表示的垂直分辨率

 

002Eh

Colors

1 dword

位图使用的颜色数。如8-位/像素表示为100h或者 256.

 

0032h

Important Colors

1 dword

指定重要的颜色数。当该域的值等于颜色数时,表示所有

颜色都一样重要

调色板数据

0036h

Palette

N * 4 byte

调色板规范。对于调色板中的每个表项,这4个字节用下述

方法来描述RGB的值:

  • 1字节用于蓝色分量
  • 1字节用于绿色分量
  • 1字节用于红色分量
  • 1字节用于填充符(设置为0)

图像数据

0436h

Bitmap Data

x bytes

该域的大小取决于压缩方法,它包含所有的位图数据字节

,这些数据实际就是彩色调色板的索引号

 example: gray.bmp

  • gray.bmp的图片信息

bubuko.com,布布扣

bubuko.com,布布扣

  • grap.bmp在存储器上的数据内容

bubuko.com,布布扣

二、8位灰度格式转换到16位565RGB的格式

#define GRAYTORGB16(t) ((t >> 3)|((t & ~3) << 3)|((t & ~7) << 8))

三、程序代码

/**
  * @brief  显示灰度图 
  * @param  x,y : 显示在LCD上的坐标 
  *         pic_name: 存储在SD卡根目录下的灰度文件名
  * @retval None
  */
void Lcd_show_bmp(unsigned short int x, unsigned short int y,char *pic_name)
{
    int i, j;
    int width, height, l_width;    
    BITMAPFILEHEADER bitHead;
    BITMAPINFOHEADER bitInfoHead;
    WORD fileType;
    unsigned int read_num;

    f_mount(0, &bmpfs[0]);
    BMP_DEBUG_PRINTF("file mount ok \r\n");    
    bmpres = f_open( &bmpfsrc , (char *)pic_name, FA_OPEN_EXISTING | FA_READ);    

    if(bmpres == FR_OK)
    {
        BMP_DEBUG_PRINTF("Open file success\r\n");

        /* 读取文件头信息  两个字节*/         
        f_read(&bmpfsrc,&fileType,sizeof(WORD),&read_num);     

        /* 判断是不是bmp文件 "BM"*/
        if(fileType != 0x4d42)
        {
            BMP_DEBUG_PRINTF("file is not .bmp file!\r\n");
            return;
        }
        else
        {
            BMP_DEBUG_PRINTF("Ok this is .bmp file\r\n");    
        }        

        /* 读取BMP文件头信息*/
        f_read(&bmpfsrc,&bitHead,sizeof(tagBITMAPFILEHEADER),&read_num);        
        showBmpHead(&bitHead);

        /* 读取位图信息头信息 */
        f_read(&bmpfsrc,&bitInfoHead,sizeof(BITMAPINFOHEADER),&read_num);        
        showBmpInforHead(&bitInfoHead);
    }    
    else
    {
        BMP_DEBUG_PRINTF("file open fail!\r\n");
        return;
    }    

    width = bitInfoHead.biWidth;
    height = bitInfoHead.biHeight;

    /* 计算位图的实际宽度并确保它为4的倍数    */
    l_width = WIDTHBYTES(width);
    if(l_width > 320)
    {
        BMP_DEBUG_PRINTF("\n SORRY, PIC IS TOO BIG (<=320)\n");
        return;
    }
    
    /* 设置Lcd Gram 扫描方向为: 右下角-> 左上角 */
    Lcd_GramScan(3);
    
    /* 开一个图片大小的窗口*/
    LCD_OpenWindow(x, y, width, height);
    
    /* 判断是否是8bit灰度图 */
    if(bitInfoHead.biBitCount == 8)
    {
        f_lseek(&bmpfsrc,0x0436);
        
        for(i=0;i< height; i++)
        {      
            /* 读取一行bmp的数据到数组pColorData里面 */
            f_read(&bmpfsrc,pColorData,l_width,&read_num);

            for(j=0; j<width; j++)                  //一行有效信息
            {
                unsigned short d; 
                d = pColorData[j];
                LCD_WR_Data(GRAYTORGB16(d));        //写入LCD-GRAM
            } 
        }
    }    
    else 
    {        
        BMP_DEBUG_PRINTF("SORRY, THIS PIC IS NOT A 8BITS GRAY Picture!");
        return ;
    }
    f_close(&bmpfsrc);    
}

 

参考资料:bmp头文件和8 bit 灰度图的显示

     《STM32库开发实战指南》

8位灰度图在LCD上显示,布布扣,bubuko.com

8位灰度图在LCD上显示

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/amanlikethis/p/3862669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!