📄 bitmap.cpp
字号:
#include "Bitmap.h"
#include <string>
#include "au_bitmap.h"
using namespace std;
void BitmapConverter::display_headers(const Bitmap& bitmap)
{
printf("BMP File Header (%d bytes):\n", sizeof(bitmap.fileHeader));
printf("Identifier: %X\n", bitmap.fileHeader.identifier);
printf("File Size: %d bytes\n", bitmap.fileHeader.fileSize);
printf("Reserved: %X\n", bitmap.fileHeader.reserved);
printf("Data Offset: %X\n", bitmap.fileHeader.dataOffset);
printf("Header Size: %d bytes\n", bitmap.fileHeader.headerSize);
printf("\n");
printf("BMP Info Header (%d bytes):\n", sizeof(bitmap.infoHeader));
printf("Width: %X\n", bitmap.infoHeader.width);
printf("Height: %X\n", bitmap.infoHeader.height);
printf("Planes: %X\n", bitmap.infoHeader.planes);
printf("Bits Per Pixel: %X\n", bitmap.infoHeader.bitsPerPixel);
printf("Compression: %X\n", bitmap.infoHeader.compression);
printf("Bitmap Data Size: %X\n", bitmap.infoHeader.bitmapDataSize);
printf("H-Resolution: %X\n", bitmap.infoHeader.hresolution);
printf("V-Resolution: %X\n", bitmap.infoHeader.vresolution);
printf("Colors: %X\n", bitmap.infoHeader.colors);
printf("Important Colors: %X\n", bitmap.infoHeader.importantColors);
}
int BitmapConverter::load(const string& dibPath)
{
int result = 0;
ifstream f_in(dibPath.c_str());
char trash[10];
if(f_in)
{
Bitmap bitmap;
f_in.read((char*) &bitmap.fileHeader, sizeof(bitmap.fileHeader));
f_in.read((char*) &bitmap.infoHeader, sizeof(bitmap.infoHeader));
//display_headers(bitmap);
//Load pixel data
bytesPerPixel_ = bitmap.infoHeader.bitsPerPixel / 8;
int padding = bitmap.infoHeader.width & 0x03;
for(int i = 0; i < bitmap.infoHeader.height; ++i)
{
BitmapRow row;
for(int j = 0; j < bitmap.infoHeader.width; ++j)
{
Pixel pixel;
f_in.read((char*) &pixel.blue, 1); //red
f_in.read((char*) &pixel.green, 1); //green
f_in.read((char*) &pixel.red, 1); //blue
row.push_back(pixel);
}
f_in.ignore(padding); //discard padding
bitmap.rows.push_back(row);
}
bitmaps_.push_back(bitmap);
result = 1;
}
f_in.close();
return result;
}
int BitmapConverter::convertColor(int color, int orig, int conv)
{
int value;
int maxOrigColor = 0, maxConvColor = 0;
double percent;
int i;
for(i = 0; i < orig; ++i)
maxOrigColor |= (1 << i);
for(i = 0; i < conv; ++i)
maxConvColor |= (1 << i);
percent = color ? double(color & maxOrigColor) / double(maxOrigColor) : 0;
value = (int)(double(maxConvColor) * percent) & maxConvColor;
return value;
}
int BitmapConverter::output_bitmap(ofstream& f_out, Bitmap& bitmap, int colorDepth)
{
int r,g,b;
int rDepth, gDepth, bDepth;
uint32 temp;
switch(colorDepth)
{
case 16: rDepth = 5;
gDepth = 6;
bDepth = 5;
break;
}
int id = AU_BITMAP_ID;
int fileSize = (bitmap.infoHeader.width * bitmap.infoHeader.height * (colorDepth / 8)) +
sizeof(bitmap.infoHeader.width) +
sizeof(bitmap.infoHeader.height) +
sizeof(fileSize) +
sizeof(id);
int padding = (0xF - ((fileSize-1) & 0x0F));
fileSize += padding;
f_out.write((char*) &id, sizeof(id));
f_out.write((char*) &fileSize, sizeof(fileSize));
f_out.write((char*) &bitmap.infoHeader.width, sizeof(bitmap.infoHeader.width));
f_out.write((char*) &bitmap.infoHeader.height, sizeof(bitmap.infoHeader.height));
for(BitmapRows::reverse_iterator bIter = bitmap.rows.rbegin();
bIter != bitmap.rows.rend();
++bIter)
{
for(BitmapRow::const_iterator pIter = (*bIter).begin();
pIter != (*bIter).end();
++pIter)
{
r = convertColor((*pIter).blue, bitmap.infoHeader.bitsPerPixel / 3, bDepth);
g = convertColor((*pIter).green, bitmap.infoHeader.bitsPerPixel / 3, gDepth);
b = convertColor((*pIter).red, bitmap.infoHeader.bitsPerPixel / 3, rDepth);
temp = r | (g << rDepth) | (b << (rDepth + gDepth));
// temp = b | (g << bDepth) | (r << (bDepth + gDepth));
f_out.write((char*) &temp, colorDepth / 8 );
}
}
for(int i = 0; i < padding; ++i)
{
temp = 0xFFFFFFFF;
f_out.write((char*) &temp, 1);
}
}
int BitmapConverter::save(const string& path, int colorDepth)
{
int result = 0;
ofstream f_out(path.c_str());
if(f_out)
{
for(BitmapVector::iterator iter = bitmaps_.begin(); iter != bitmaps_.end(); ++iter)
output_bitmap(f_out, *iter, colorDepth);
result = 1;
}
f_out.close();
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -