BMP文件右旋90度[c语言]
来源:互联网 发布:中国经济数据对比 编辑:程序博客网 时间:2024/05/16 10:00
#include <stdio.h>#include <stdlib.h>#include <math.h>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;}
Before:
after:
代码在vs2010, os X 10.8.0 上测试通过。在windows上运行失败可将 typedef unsigned int LONG 修改成 typedef unsigned long LONG.
[上述代码适用于单色BMP文件](biBitCount = 1)
上述方法有问题,正确的请参[http://201211131343.iteye.com/blog/1992364
]
5 0
- BMP文件右旋90度[c语言]
- C 语言生成BMP 文件
- 解析bmp文件(C语言)
- C语言读写BMP文件
- BMP文件操作C语言
- c语言读取bmp文件
- C语言生成BMP文件
- C语言构建BMP文件(一)
- 使用C语言读取bmp文件数据
- C语言读写bmp位图文件
- c语言读取bmp文件完整版
- c语言----高位舍弃的左旋和右旋操作
- C语言三种方法实现字符串右旋
- C 语言bmp 解析
- BMP文件学习笔记(一): C/C++语言实现.bmp文件读写
- 用C语言解析BMP文件的结构
- 用C语言解析BMP文件的结构
- 如何用C语言解析BMP文件的结构
- 3G上网卡在Liunx系统上实现上网的过程
- 背景色透明rgba
- Typedef的用法
- linux之GPIO的使用
- Linux c/c++访问Oracle数据库--游标操作
- BMP文件右旋90度[c语言]
- vi命令模式下的操作
- Cocos2d-X游戏【泰然网《跑酷》】JS到C++移植11:添加金币和障碍物到地图中
- rman远程nfs备份不完全回复
- 域名解析服务器. BIND9 的安装与配置
- 三、21点扑克记牌器
- 详解EBS接口开发之供应商导入补充-供应商地点增加实例
- 计算机类核心期刊排名
- Hibernate分页