linux 写c程序额图片,linux下C语言之BMP图片操作编程(中)

关于BMP图的介绍之前已经说过了,最近要用到,又要重新开始学习。

现在实现一个让bmp左转的效果:

#include

#include

#include

#define RGB(r,g,b) ((r<<16)|(g<<8)|b)

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 != 3)

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 ;

}

struct bmp_header header ;

int ret ;

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

printf(" Signatue[0] : %c \n " , header.Signatue[0] );

printf(" Signatue[1] : %c \n " , header.Signatue[1] );

printf(" FileSize : %d \n " , header.FileSize );

printf(" Reserv1 : %d \n " , header.Reserv1 );

printf(" Reserv2 : %d \n " , header.Reserv2 );

printf(" FileOffset : %d \n " , header.FileOffset );

printf(" DIBHeaderSize : %d \n " , header.DIBHeaderSize);

printf(" ImageWidth : %d \n " , header.ImageWidth );

printf(" ImageHight : %d \n " , header.ImageHight );

printf(" Planes : %d \n " , header.Planes );

printf(" BPP : %d \n " , header.BPP );

printf(" Compression : %d \n " , header.Compression );

printf(" ImageSize : %d \n " , header.ImageSize );

printf(" XPPM : %d \n " , header.XPPM );

printf(" YPPM : %d \n " , header.YPPM );

printf(" CCT : %d \n " , header.CCT );

printf(" ICC : %d \n " , header.ICC );

char buffer[header.ImageSize] ;

read(fd , buffer , header.ImageSize);

close(fd);

//改变地方

header.ImageWidth = 480;

header.ImageHight = 800 ;

write(dest_fd , &header , sizeof(struct bmp_header));

int row , col ;

char *p = NULL ;

for(col = 0 ; col < 800; col++)

{

for(row = 480-1 ; row >= 0; row--)

{

p =( buffer+(row*800 + col)*3);

//data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p+1)) ,

//(unsigned char )(*(p)));

write(dest_fd , p , 3);

}

}

close(dest_fd);

return 0 ;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值