linu下C言語のBMP画像操作プログラミング(下)

3311 ワード

前にBMPを左に曲がるプログラムをアップしましたが、右に曲がるのも似たような操作で、書かないでください.この節では、BMP図を階調処理し、コードを貼り付けます.
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define  RGB(r,g,b)    		((r+g+b)/3)

typedef  unsigned char  U8 ; 
typedef  unsigned short U16 ; 
typedef  unsigned int   U32 ; 

#pragma  pack(1)
struct bmp_header
{
	//bmp header
	U8  Signatue[2] ;   // B  M
	U32 FileSize ;     //    
	U16 Reserv1 ; 
	U16 Reserv2 ; 
	U32 FileOffset ;   //      
	
	//DIB header
	U32 DIBHeaderSize ; //DIB   
	U32 ImageWidth   ;  //    
	U32 ImageHight   ;  //    
	U16 Planes       ; 
	U16 BPP          ;  //        
	U32 Compression  ; 
	U32 ImageSize    ;  //     
	U32 XPPM ; 
	U32 YPPM ; 
	U32 CCT ; 
	U32 ICC ;          
};
#pragma  pack()


int main(int argc , char **argv)
{
	if(argc != 4)
		return -1 ; 

	int fd ; 
	int dest_fd ; 
	fd = open(argv[1] , O_RDONLY);
	if(-1 == fd)
	{
		perror("open bmp file fail");
		return -2 ; 
	}

	dest_fd = open( argv[2] , O_RDWR | O_CREAT|O_TRUNC , 0777);
	if(dest_fd < 0 )
	{
		perror("open rgb565 fail");
		return -3 ; 
	}
	int value = atoi(argv[3]);

	struct bmp_header  header ; 

	int ret ; 
	
	ret = read(fd , &header , sizeof(struct bmp_header));


	printf(" Signatue[0]      : %c  
" , header.Signatue[0] ); printf(" Signatue[1] : %c
" , header.Signatue[1] ); printf(" FileSize : %d
" , header.FileSize ); printf(" Reserv1 : %d
" , header.Reserv1 ); printf(" Reserv2 : %d
" , header.Reserv2 ); printf(" FileOffset : %d
" , header.FileOffset ); printf(" DIBHeaderSize : %d
" , header.DIBHeaderSize); printf(" ImageWidth : %d
" , header.ImageWidth ); printf(" ImageHight : %d
" , header.ImageHight ); printf(" Planes : %d
" , header.Planes ); printf(" BPP : %d
" , header.BPP ); printf(" Compression : %d
" , header.Compression ); printf(" ImageSize : %d
" , header.ImageSize ); printf(" XPPM : %d
" , header.XPPM ); printf(" YPPM : %d
" , header.YPPM ); printf(" CCT : %d
" , header.CCT ); printf(" ICC : %d
" , header.ICC ); char buffer[header.ImageSize] ; read(fd , buffer , header.ImageSize); close(fd); // write(dest_fd , &header , sizeof(struct bmp_header)); int row , col ; char *p = NULL ; for(row = 0 ; row < 10 ; row++) { for(col = 0 ; col < 10 ; col++) { p = buffer + (row * 800 + col)*3 ; *p = 255; *(p+1)=255; *(p+2)=255; } } char data ; for(row = 0 ; row < 480 ; row++) { for(col = 0 ; col < 800 ; col++) { p =( buffer+(row*800 + col)*3); data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p+1)) , (unsigned char )(*(p))); if(data < value) { *p = 0; *(p+1)=0; *(p+2)=0; } else { *p = data; *(p+1)=data; *(p+2)=data; } write(dest_fd , p , 3); } } close(dest_fd); return 0 ; }