⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_graphic_inv.h

📁 C语言下显示bmp的实例例程。希望能给大家参考一下
💻 H
字号:
#include "lcd.h"
#include <stdio.h>
#include <math.h>

void lcd_eraser(char *buf)
{
	int i;
	for(i=0 ; i<76800 ; i++) *(buf+i)=0x00;
}

void put_pixel(char *buf, int x, int y, char color)
{
	int addr,Sel;

	addr = 320*y+x;
	Sel = addr&3;
	
	if(Sel==3) *(buf+addr-3)=color;
	else if(Sel==2) *(buf+addr-1)=color;
	else if(Sel==1) *(buf+addr+1)=color;
	else if(Sel==0) *(buf+addr+3)=color;

}

int get_pixel(char *buf, int x, int y)
{
	int addr,Sel;

	addr = 320*y+x;
	Sel = addr&3;
	
	if(Sel==3) return *(buf+addr-3);
	else if(Sel==2) return *(buf+addr-1);
	else if(Sel==1) return *(buf+addr+1);
	else if(Sel==0) return *(buf+addr+3);
	return 0;
}

#define abs(x) ( (x) > 0 ) ? (x) :( -(x))
#define two(x) ( (x) << 1 )

void line(char *buf, int x1, int y1, int x2, int y2, char color)
{
	int x, y, count, dx, dy, Xinc, Yinc, err, twodx;

	x = x1; y = y1;
	count = dx = abs ( x2 - x1 );
	twodx = two ( dx );
	dy = abs ( y2 - y1 );
	Xinc = ( x2 > x1 ) ? (1) : (-1);
	Yinc = ( y2 > y1 ) ? (1) : (-1);
	err = 0;

	while ( count-- >= 0 ){
		if ( err < dx )
			err += dy;
		else{
			y += Yinc;
			err += dy - twodx;
		}
		put_pixel(buf,x,y,color);

		while ( (y != y2) && (err > twodx) ){
			y += Yinc;
			err -= twodx;
			put_pixel(buf,x,y,color);
		}
		x += Xinc;
		err += dy;
	}
}

void rectangle(char *buf, int x1, int y1, int x2, int y2, char color)
{
  	line(buf,x1,y1,x2,y1,color);
  	line(buf,x1,y1,x1,y2,color);
  	line(buf,x2,y1,x2,y2,color);
  	line(buf,x1,y2,x2,y2,color);
}

void box(char *buf, int x1, int y1, int x2, int y2, char color)
{
  	line(buf,x1,y1,x2,y1,color);
  	line(buf,x1,y1,x1,y2,color);
  	line(buf,x2,y1,x2,y2,color);
  	line(buf,x1,y2,x2,y2,color);
}

void bar(char *buf, int x1, int y1, int x2, int y2, char color)
{
 	int X1,Y1,X2,Y2,i,j;
 	X1=x1; X2=x2; Y1=y1; Y2=y2;
 	if(x1>x2){
	 	X1=x2;
	 	X2=x1;
 	}
 	
 	if(y1>y2){
	 	Y1=y2;
	 	Y2=y1;
 	}
 
 	for(i=X1;i<=X2;i++)  for(j=Y1;j<=Y2;j++)put_pixel(buf,i,j,color);
}

//#define  asp_ratio 1
//int asp_ratio, 
void plot_circle(char *buf, int x, int y, int x_center, int y_center, int asp_ratio, char color_code)
{
 	int startx,endx,x1,starty,endy,y1;
    	starty = y*asp_ratio;        
    	endy = (y+1)*asp_ratio;
    	startx = x*asp_ratio;
    	endx = (x+1)*asp_ratio;


    	for(x1=startx; x1<endx ; ++x1){
      		put_pixel(buf,x1+x_center, y+y_center, color_code);
      		put_pixel(buf,x1+x_center, y_center-y, color_code);
      		put_pixel(buf,x_center-x1, y_center-y, color_code);
      		put_pixel(buf,x_center-x1, y+y_center, color_code);
    	}

    	for(y1=starty; y1<endy ; ++y1){
      		put_pixel(buf,y1+x_center, x+y_center, color_code);
      		put_pixel(buf,y1+x_center, y_center-x, color_code);
      		put_pixel(buf,x_center-y1, y_center-x, color_code);
      		put_pixel(buf,x_center-y1, x+y_center, color_code);
    	}

}

void ellipse(char *buf, int x_center, int y_center, int radius, int asp_ratio, char color_code)
{

    	register int x,y,delta;
             
    	y= radius ;
    	delta = 3 - 2*radius;
	
    	for(x=0; x<y ; x++){
      		plot_circle(buf,x,y,x_center,y_center, asp_ratio, color_code);

      		if(delta<0)
         			delta += 4*x + 6;
      		else {
         			delta += 4*(x-y) + 10;
      			y-- ;
      		}
    	}
    	
    	x = y;
    	
    	if (y)  plot_circle(buf,x,y,x_center,y_center, asp_ratio, color_code);
}

void circle(char *buf, int x_center, int y_center, int radius, char color_code)
{
	ellipse(buf, x_center, y_center, radius, 1, color_code);
}


void rgb_bar(char *buf)
{
	int i;
	
	for(i=20 ; i<100 ; i++) line(buf,i,20,i,220,Red_C);
	for(i=120 ; i<200 ; i++) line(buf,i,20,i,220,Green_C);
	for(i=220 ; i<300 ; i++) line(buf,i,20,i,220,Blue_C);
}

void color_bar(char *buf)
{
	int i;
	
	for(i=20 ; i<60 ; i++) line(buf,i,0,i,240,White_C);
	for(i=60 ; i<100 ; i++) line(buf,i,0,i,240,Yellow_C);
	for(i=100 ; i<140 ; i++) line(buf,i,0,i,240,SkyBlue_C);
	for(i=140 ; i<180 ; i++) line(buf,i,0,i,240,Green_C);
	for(i=180 ; i<220 ; i++) line(buf,i,0,i,240,Purple_C);
	for(i=220 ; i<260 ; i++) line(buf,i,0,i,240,Red_C);
	for(i=260 ; i<300 ; i++) line(buf,i,0,i,240,Blue_C);
}


//-----------------------------------------------
//BMP image function
//-----------------------------------------------
typedef unsigned char 	BYTE;
typedef unsigned short WORD;
typedef unsigned int	DWORD;

typedef	struct{			// Windows (.BMP) file 位图文件头
	WORD	bmp_id;		// "BM"=0x424D
	DWORD	bmp_size;
	WORD	reserv_1;	// 0
	WORD	reserv_2;	// 0
	DWORD	offset;
} BMP_HEADER;

typedef	struct{		
	DWORD	InfoHeadSize;	// 0x28 = 40byte
	DWORD	width_x;
	DWORD	width_y;
	WORD	planes;		// = 1
	WORD	BitPixel;	// 1 (2 color), 4 (16 color), 8 (256color)
	DWORD	Compression;
	DWORD	Imagesize;
	DWORD	X_Resolution;
	DWORD	Y_Resolution;
	DWORD	Colors;
	DWORD	ImportantColors;
} BMP_INFO_HEADER;

typedef	struct{
	char		Blue;
	char 	Green;
	char 	Red;
	char 	Reserved;	// 0
} RGB_BLOCK;

int draw_bmp(char *buf, int base_x, int base_y, unsigned char *bmp_image)
{	
	int i,j,index=0;
	BMP_HEADER *header;
	BMP_INFO_HEADER *info_header;
	RGB_BLOCK *rgb;
	BYTE R,G,B;
	BYTE palette[256];

	header=(BMP_HEADER *)malloc(sizeof(BMP_HEADER));
	info_header=(BMP_INFO_HEADER *)malloc(sizeof(BMP_INFO_HEADER));

//------------------------------------------
// deal with the bmp file header
//------------------------------------------
	header->bmp_id=(WORD)bmp_image[index++];
	header->bmp_id+=(WORD)bmp_image[index++]<<8;

	header->bmp_size=(DWORD)bmp_image[index++];
	header->bmp_size+=(DWORD)bmp_image[index++]<<8;
	header->bmp_size+=(DWORD)bmp_image[index++]<<16;
	header->bmp_size+=(DWORD)bmp_image[index++]<<24;

	header->reserv_1=(WORD)bmp_image[index++];
	header->reserv_1=(WORD)bmp_image[index++]<<8;
	
	header->reserv_2=(WORD)bmp_image[index++];
	header->reserv_2=(WORD)bmp_image[index++]<<8;

	header->offset=(DWORD)bmp_image[index++];
	header->offset+=(DWORD)bmp_image[index++]<<8;
	header->offset+=(DWORD)bmp_image[index++]<<16;
	header->offset+=(DWORD)bmp_image[index++]<<24;

	

#if 0
	printf("bmp_id=0x%x,%d\n",header->bmp_id,header->bmp_id);
	printf("bmp_size=0x%x,%d\n",header->bmp_size,header->bmp_size);
	printf("bmp_reserv_1=0x%x,%d\n",header->reserv_1,header->reserv_1);
	printf("bmp_reserv_2=0x%x,%d\n",header->reserv_2,header->reserv_2);
	printf("bmp_offset=0x%x,%d\n",header->offset,header->offset);
#endif

	if(header->bmp_id!=0x4d42){
		printf("this is not bmp file\n");
		return 1;
	}
	if(header->bmp_size>77878){
		printf("the image file is too big\n");
		return 1;
	}

//-----------------------------------------------------------
// deal with the bmp information header
//-----------------------------------------------------------
	info_header->InfoHeadSize=(DWORD)bmp_image[index++];	// 0x28 = 40byte
	info_header->InfoHeadSize+=(DWORD)bmp_image[index++]<<8;	
	info_header->InfoHeadSize+=(DWORD)bmp_image[index++]<<16;	
	info_header->InfoHeadSize+=(DWORD)bmp_image[index++]<<24;	

	info_header->width_x=(DWORD)bmp_image[index++];
	info_header->width_x+=(DWORD)bmp_image[index++]<<8;
	info_header->width_x+=(DWORD)bmp_image[index++]<<16;
	info_header->width_x+=(DWORD)bmp_image[index++]<<24;
	
	info_header->width_y=(DWORD)bmp_image[index++];
	info_header->width_y+=(DWORD)bmp_image[index++]<<8;
	info_header->width_y+=(DWORD)bmp_image[index++]<<16;
	info_header->width_y+=(DWORD)bmp_image[index++]<<24;

	info_header->planes=(WORD)bmp_image[index++];		// = 1
	info_header->planes+=(WORD)bmp_image[index++]<<8;		

	info_header->BitPixel=(WORD)bmp_image[index++];	// 1 (2 color), 4 (16 color), 8 (256color)
	info_header->BitPixel+=(WORD)bmp_image[index++]<<8;

	info_header->Compression=(DWORD)bmp_image[index++];
	info_header->Compression+=(DWORD)bmp_image[index++]<<8;
	info_header->Compression+=(DWORD)bmp_image[index++]<<16;
	info_header->Compression+=(DWORD)bmp_image[index++]<<24;

	info_header->Imagesize=(DWORD)bmp_image[index++];
	info_header->Imagesize+=(DWORD)bmp_image[index++]<<8;
	info_header->Imagesize+=(DWORD)bmp_image[index++]<<16;
	info_header->Imagesize+=(DWORD)bmp_image[index++]<<24;

	info_header->X_Resolution=(DWORD)bmp_image[index++];
	info_header->X_Resolution+=(DWORD)bmp_image[index++]<<8;
	info_header->X_Resolution+=(DWORD)bmp_image[index++]<<16;
	info_header->X_Resolution+=(DWORD)bmp_image[index++]<<24;
	
	info_header->Y_Resolution=(DWORD)bmp_image[index++];
	info_header->Y_Resolution+=(DWORD)bmp_image[index++]<<8;
	info_header->Y_Resolution+=(DWORD)bmp_image[index++]<<16;
	info_header->Y_Resolution+=(DWORD)bmp_image[index++]<<24;
	
	info_header->Colors=(DWORD)bmp_image[index++];
	info_header->Colors+=(DWORD)bmp_image[index++]<<8;
	info_header->Colors+=(DWORD)bmp_image[index++]<<16;
	info_header->Colors+=(DWORD)bmp_image[index++]<<24;

	info_header->ImportantColors=(DWORD)bmp_image[index++];
	info_header->ImportantColors+=(DWORD)bmp_image[index++]<<8;
	info_header->ImportantColors+=(DWORD)bmp_image[index++]<<16;
	info_header->ImportantColors+=(DWORD)bmp_image[index++]<<24;


#if 0
	printf("info_header->InfoHeadSize=0x%x,%d\n",info_header->InfoHeadSize,info_header->InfoHeadSize);	// 0x28 = 40byte
	printf("info_header->width_x=0x%x,%d\n",info_header->width_x,info_header->width_x);
	printf("info_header->width_y=0x%x,%d\n",info_header->width_y,info_header->width_y);
	printf("info_header->planes=0x%x,%d\n",info_header->planes,info_header->planes);
	printf("info_header->BitPixel=0x%x,%d\n",info_header->BitPixel,info_header->BitPixel);
	printf("info_header->Compression=0x%x,%d\n",info_header->Compression,info_header->Compression);
	printf("info_header->Imagesize=0x%x,%d\n",info_header->Imagesize,info_header->Imagesize);
	printf("info_header->X_Resolution=0x%x,%d\n",info_header->X_Resolution,info_header->X_Resolution);
	printf("info_header->Y_Resolution=0x%x,%d\n",info_header->Y_Resolution,info_header->Y_Resolution);
	printf("info_header->Colors=0x%x,%d\n",info_header->Colors,info_header->Colors);
	printf("info_header->ImportantColors=0x%x,%d\n",info_header->ImportantColors,info_header->ImportantColors);
#endif

	if(info_header->BitPixel>8){
		printf("color is more than 256\n");
		return 1;
	}
	if(info_header->Imagesize>76800){
		printf("the image size is bigger than 320*240\n");
		return 1;
	}
	rgb=(RGB_BLOCK *)(bmp_image+54);
	for(i=0;i<256;i++){
//		R=rgb->Red&0xe0;
//		G=(rgb->Green&0xe0)>>3;
//		B=(rgb->Blue&0xc0)>>6;
//		palette[i]=R | G | B;
		R=(rgb->Red&0xe0)>>3;
		G=(rgb->Green&0xe0);
		B=(rgb->Blue&0xc0)>>6;
		palette[i]=G | R | B;
		rgb++;
	}

	index+=256*4;
	for(i=0;i<info_header->width_y;i++){
		for(j=0;j<info_header->width_x;j++){
			put_pixel(buf,j,(info_header->width_y-i),palette[*(bmp_image+(i*info_header->width_x)+j+header->offset)]);	
		}
	}
	free(info_header);
	free(header);
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -