#include <iostream>
#include <fstream>
#include <Windows.h>
#pragma pack(1)
using namespace std;
struct fileHEADER
{
WORD bfType; // 位圖檔案的型別,必須為“BM”
DWORD bfSize; // 位圖檔案的大小,以位元組為單位
WORD bfReserved1; // 位圖檔案保留字,必須為 0
WORD bfReserved2; // 位圖檔案保留字,必須為 0
DWORD bfOffBits; // 位圖資料的起始位置,以相對于位圖檔案頭的偏移量表示,以位元組為單位
}FILEHEADER;
struct tagHEADER {
DWORD biSize; // 本結構所占用位元組數
LONG biWidth; // 位圖的寬度,以像素為單位
LONG biHeight; // 位圖的高度,以像素為單位
WORD biPlanes; // 目標設備的平面數不清,必須為 1
WORD biBitCount;// 每個像素所需的位數,必須是 1(雙色), 4(16 色),8(256 色)或 24(真彩色)之一
DWORD biCompression; // 位圖壓縮型別,必須是 0(不壓縮),1(BI_RLE8 壓縮型別)或 2(BI_RLE4壓縮型別)之一
DWORD biSizeImage; // 位圖的大小,以位元組為單位
LONG biXPelsPerMeter; // 位圖水平解析度,每米像素數
LONG biYPelsPerMeter; // 位圖垂直解析度,每米像素數
DWORD biClrUsed;// 位圖實際使用的顏色表中的顏色數
DWORD biClrImportant;// 位圖顯示程序中重要的顏色數
}TAGHEADER;//該結構占據 40 個位元組
struct Colordata
{
BYTE blue, green, red;
};
int main()
{
ifstream fin("pkq.bmp", ios::in | ios::binary);
if (!fin)
cout << "fin error!" << endl;
fin.read((char*)&FILEHEADER, sizeof(fileHEADER));
fin.read((char*)&TAGHEADER, sizeof(tagHEADER));
int h = TAGHEADER.biHeight, w = TAGHEADER.biWidth;
int n;
n = (w * 24 + 31) / 8; n -= n % 4;
int a = n - w * 3;
n = (h * 24 + 31) / 8; n -= n % 4;
int b = n - h * 3;
Colordata* p = new Colordata[h * w];
for (int i = 0; i < h; ++i)
{
for (int j = 0; j < w; ++j)
fin.read((char*)(p + i * w + j), sizeof(Colordata));
fin.seekg(a, ios::cur);
}
fin.close();
TAGHEADER.biHeight = w;
TAGHEADER.biWidth = h;
FILEHEADER.bfSize = (h * 3 + b) * w + 54;
cout << FILEHEADER.bfSize;
ofstream fout("rotatepkq.bmp", ios::out | ios::binary);
if (!fout)
cout << "fout error!";
fout.write((char*)&FILEHEADER, sizeof(fileHEADER));
fout.write((char*)&TAGHEADER, sizeof(tagHEADER));
for (int i = (w - 1); i >= 0; --i)
{
for (int j = 0; j < h; ++j)
fout.write((char*)(p + j * w + i), sizeof(Colordata));
fout.seekp(b, ios::cur);
}
fout.close();
delete[]p;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103084.html
標籤:C++ 語言
