#include<string.h>
#include<stdlib.h>
#include"z.h"
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biComPression;
unsigned long biSizelmage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrlmportant;
#include<stdlib.h>
#include"z.h"
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biComPression;
unsigned long biSizelmage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrlmportant;
}BITMAPINFOHEADER;
int main(int argc,char *argv[]){
FILE*fp=fopen(argv[1],"rb");
FILE*newfp=fopen(argv[2],"wb");
if(fp==NULL||newfp==NULL){
printf("fopen error!\n");
exit(1);
}
BITMAPFILEHEADER bithead;
BITMAPINFOHEADER bitinfo;
memset(&bithead,0,sizeof(BITMAPFILEHEADER));
memset(&bitinfo,0,sizeof(BITMAPINFOHEADER));
perror("memset");
fread(&bithead,1,sizeof(BITMAPFILEHEADER),fp);
fread(&bitinfo,1,sizeof(BITMAPINFOHEADER),fp);
perror("fread");
char*p=(char*)&bithead.bfType;
if(*p!='B'||*(p+1)!='M'){
printf("error!\n");
exit(1);
}
// fwrite(&bithead,1,sizeof(BITMAPFILEHEADER),newfp);
// fwrite(&bitinfo,1,sizeof(BITMAPINFOHEADER),newfp);
unsigned long x0=atoi(argv[3]);
unsigned long y0=atoi(argv[4]);
unsigned long x1=atoi(argv[5]);
unsigned long y1=atoi(argv[6]);
if(x0>500||y0>306||x1<x0||y1<y0){
printf("print error!\n");
exit(1);
}
BITMAPFILEHEADER bithead1;
BITMAPINFOHEADER bitinfo1;
memset(&bithead1,0,sizeof(BITMAPFILEHEADER));
memset(&bitinfo1,0,sizeof(BITMAPINFOHEADER));
char*sp=(char*)&bithead1.bfType;
*sp='B';
*(sp+1)='M';
perror("sp");
sleep(1);
bithead1.bfSize=(x1-x0)*(y1-y0)*3+54;
bithead1.bfOffBits=54;
bitinfo1.biSize=sizeof(BITMAPINFOHEADER);
bitinfo1.biWidth=x1-x0;
bitinfo1.biHeight=y1-y0;
memset(&bithead,0,sizeof(BITMAPFILEHEADER));
memset(&bitinfo,0,sizeof(BITMAPINFOHEADER));
perror("memset");
fread(&bithead,1,sizeof(BITMAPFILEHEADER),fp);
fread(&bitinfo,1,sizeof(BITMAPINFOHEADER),fp);
perror("fread");
char*p=(char*)&bithead.bfType;
if(*p!='B'||*(p+1)!='M'){
printf("error!\n");
exit(1);
}
// fwrite(&bithead,1,sizeof(BITMAPFILEHEADER),newfp);
// fwrite(&bitinfo,1,sizeof(BITMAPINFOHEADER),newfp);
unsigned long x0=atoi(argv[3]);
unsigned long y0=atoi(argv[4]);
unsigned long x1=atoi(argv[5]);
unsigned long y1=atoi(argv[6]);
if(x0>500||y0>306||x1<x0||y1<y0){
printf("print error!\n");
exit(1);
}
BITMAPFILEHEADER bithead1;
BITMAPINFOHEADER bitinfo1;
memset(&bithead1,0,sizeof(BITMAPFILEHEADER));
memset(&bitinfo1,0,sizeof(BITMAPINFOHEADER));
char*sp=(char*)&bithead1.bfType;
*sp='B';
*(sp+1)='M';
perror("sp");
sleep(1);
bithead1.bfSize=(x1-x0)*(y1-y0)*3+54;
bithead1.bfOffBits=54;
bitinfo1.biSize=sizeof(BITMAPINFOHEADER);
bitinfo1.biWidth=x1-x0;
bitinfo1.biHeight=y1-y0;
bitinfo1.biPlanes=1;
bitinfo1.biBitCount=24;
fwrite(&bithead1,1,sizeof(BITMAPFILEHEADER),newfp);
fwrite(&bitinfo1,1,sizeof(BITMAPINFOHEADER),newfp);
perror("fwrite");
sleep(1);
int x,y,color;
for(y=y0;y<y1;y++)
{
int cnt=(y-1)*bitinfo.biWidth*3+x0*3;
for(x=x0;x<x1;x++)
{
bitinfo1.biBitCount=24;
fwrite(&bithead1,1,sizeof(BITMAPFILEHEADER),newfp);
fwrite(&bitinfo1,1,sizeof(BITMAPINFOHEADER),newfp);
perror("fwrite");
sleep(1);
int x,y,color;
for(y=y0;y<y1;y++)
{
int cnt=(y-1)*bitinfo.biWidth*3+x0*3;
for(x=x0;x<x1;x++)
{
color=gImage_z[cnt]<<16|gImage_z[cnt+1]<<8|gImage_z[cnt+2]<<0; cnt+=3;
fwrite(&color,3,1,newfp);
perror("fwrite");
fwrite(&color,3,1,newfp);
perror("fwrite");
}
}
fclose(fp);
fclose(newfp);
}