18.03.31 顺时针旋转90°24位真彩色bmp图片

 1 #include <iostream>
 2 #include <fstream>
 3 #include <fstream>
 4 #include <Windows.h>
 5 
 6 using namespace std;
 7 
 8 int main(int argc,char*argv[])
 9 {
10     tagBITMAPFILEHEADER a;//头信息块
11     tagBITMAPINFOHEADER b;//描述块
12     ifstream fin(argv[1], ios::binary | ios::in);//打开argv1用于读取,原文件
13     if (!fin)cout << "Source file open error." << endl;
14     ofstream fout(argv[2], ios::binary | ios::out | ios::trunc);
15     if (!fout)cout << "New file open error. ";
16     fin.read((char*)&a, sizeof(tagBITMAPFILEHEADER));
17     fin.read((char*)&b, sizeof(tagBITMAPINFOHEADER));
18     fout.write((char*)&a, sizeof(a));//写入头信息块
19     int tmp;
20     tmp = b.biWidth; b.biWidth = b.biHeight; b.biHeight = tmp;//交换宽高
21     tmp = b.biXPelsPerMeter; b.biXPelsPerMeter = b.biYPelsPerMeter; b.biYPelsPerMeter = tmp;//交换xy分辨率
22     fout.write((char*)&b, sizeof(b));//写入描述信息块
23     int pixw = 3;//1像素3字节
24     RGBTRIPLE *s = new RGBTRIPLE[b.biWidth*b.biHeight];
25     int skip = (4 - ((b.biHeight*3) % 4)) % 4;
26     for (LONG i = 0; i <b.biWidth; i++)
27         {
28             fin.read((char*)s + i*b.biHeight*3, b.biHeight*3);//转化成char 所以变成了*3……吧
29             fin.seekg(skip, ios::cur);
30         }
31     int bu_n = (4 - (b.biWidth*pixw)%4) % 4;
32     char *bu = new char[bu_n];
33     for (int i = 0; i < bu_n; i++)
34         bu[i] = 0;
35     for (LONG i = b.biHeight - 1; i >= 0; i--) {
36         for (LONG j = 0; j < b.biWidth; j++)
37             fout.write((char*)&s[j*b.biHeight+i], sizeof(tagRGBTRIPLE));
38             fout.write(bu, bu_n);
39     }
40     delete[]s;
41     delete[]bu;
42     fin.close();
43     fout.close();
44     return 0;
45 }
View Code

好像有点问题,虽然看上去好像成功了,但旋转后的图片会比原图多1kb

感觉1kb其实还挺多的,不知道是不是正常的

应该是因为0补全的原因……?

先存着……做错题导致我都不想做魔兽了tut

注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
原文地址:https://www.cnblogs.com/yalphait/p/8686033.html