c语言 bmp旋转90度,BMP文件右旋90度[c语言]

#include typedef unsigned short WORD;

typedef unsigned int DWORD;

typedef unsigned int LONG;

#pragma pack(2)

typedef struct tagBITMAPFILEHEADER

{

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

#pragma pack()

typedef struct tagBITMAPINFOHEADER{

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

/* fname- 输入文件名称 foname-输出文件名 */

void cw90(char *fname,char *foname) {

BITMAPFILEHEADER fileHeader;

BITMAPINFOHEADER infoHeader;

unsigned char palette[8];

FILE *f = fopen(fname,"rb");

if(f == NULL) {

printf("Can not find file %s\n",fname);

return;

}

fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,f);

fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,f);

fread(palette,sizeof(unsigned char),8,f);

unsigned char *data = (unsigned char*)malloc(infoHeader.biSizeImage);

fread(data,sizeof(unsigned char),infoHeader.biSizeImage,f);

FILE *of = fopen(foname,"wb");

BITMAPFILEHEADER oFileHeader;

BITMAPINFOHEADER oInfoHeader;

int lineSize = ( infoHeader.biHeight + 31) / 32 * 4;

int imageSize = lineSize * infoHeader.biWidth;

//

oFileHeader.bfType = 19778;

oFileHeader.bfSize = 62 + imageSize;

oFileHeader.bfReserved1 = 0;

oFileHeader.bfReserved2 = 0;

oFileHeader.bfOffBits = 62;

//

oInfoHeader.biSize = 40;

oInfoHeader.biWidth = infoHeader.biHeight;

oInfoHeader.biHeight = infoHeader.biWidth;

oInfoHeader.biPlanes = 1;

oInfoHeader.biBitCount = 1;

oInfoHeader.biCompression = 0;

oInfoHeader.biSizeImage = imageSize;

oInfoHeader.biXPelsPerMeter = 0;

oInfoHeader.biYPelsPerMeter = 0;

oInfoHeader.biClrUsed = 0;

oInfoHeader.biClrImportant = 0;

//

fwrite( &oFileHeader , sizeof(BITMAPFILEHEADER) , 1 , of );

fwrite( &oInfoHeader , sizeof(BITMAPINFOHEADER) , 1 , of );

fwrite( palette , 1 , 8 , of );

unsigned char *first = (unsigned char*)malloc(infoHeader.biHeight * oInfoHeader.biHeight);

unsigned char *second = (unsigned char*)malloc(infoHeader.biHeight * oInfoHeader.biHeight);

int myline = oInfoHeader.biSizeImage / oInfoHeader.biHeight;

unsigned char *third = (unsigned char*)malloc(myline * 8 * oInfoHeader.biHeight);

unsigned char *forth = (unsigned char*)malloc(myline * oInfoHeader.biHeight);

unsigned char *img = (unsigned char*)malloc(oInfoHeader.biSizeImage);

// first step

int i,j,k,t = -1;

int temp = infoHeader.biSizeImage / infoHeader.biHeight;

for(i = 0; i < infoHeader.biHeight; i++) {

for(j = 0; j < temp; j++) {

for(k = 0; k < 8; k++) {

if(j*8 + k < oInfoHeader.biHeight) {

first[++t] = data[i * temp + j] >> (8-1-k) & 1;

}

}

}

}

// second step

// rotate

t = -1;

for(i = 0; i < oInfoHeader.biHeight; i++) {

for(j = 0; j < infoHeader.biHeight; j++) {

second[++t] = first[oInfoHeader.biHeight*j + oInfoHeader.biHeight - i - 1];

}

}

// step three

// fill with 0's

t = -1;

for(i = 0; i < oInfoHeader.biHeight; i++) {

for(j = 0; j < infoHeader.biHeight; j++) {

third[++t] = second[i*infoHeader.biHeight + j];

}

for(k = infoHeader.biHeight; k < myline * 8; k++) {

third[++t] = 0;

}

}

// step four

// transfer

int u = -1;

int m = -1;

for(i = 0; i < oInfoHeader.biHeight; i++) {

for(j = 0; j < myline * 8; j++) {

int sum = 0;

for(k = 0; k < 8; k++) {

sum += pow(2,8-k-1)*third[++m%t];

}

forth[++u] = sum;

}

}

fwrite( forth , 1 , myline * oInfoHeader.biHeight , of );

free(img);

free(data);

fclose(f);

fclose(of);

}

int main() {

cw90("original.bmp","ttt.bmp");

system("pause");

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值