⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmap.cpp

📁 RMI的处理器au1200系列所用的BOOTLOAD,包括SD卡启动USB启动硬盘启动网络启动,并初始化硬件的所有参数,支持内核调试.
💻 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 + -