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 ;
}