C++:.bmp到文件中的字节数组
C++: .bmp to byte array in a file
是的,我已经经历了与此相关的其他问题,但我发现它们没有太大帮助。他们提供了一些帮助,但我仍然有点困惑。所以在这里我需要做什么:
我们有一个 132x65 的屏幕。我有一个 132x65 .bmp。我想遍历.bmp并将其分成 1x8 小列,以获取该 32 位列的二进制文件。然后横跨 132 次,向下做 9 次。任何非白色的东西都应该算作一点。例:
如果图片的左上角像素是任何非白色的颜色,而下面的 7 个像素是白色的,那么这将是数组的第一个元素,即该数字的十六进制,因此数组将如下所示:数组 [] = { 0x01 },然后它将继续填充这 132 列,然后再次填充 9 个"部分"行。文件结果将只是一个单独文件中的数组。
我了解此标题格式,我已经阅读了有关.bmp文件格式的 wiki 文章,我的主要问题是当我真正希望它进入内部并与图像中的每个像素交互时,我真的不知道如何与.bmp进行交互。我真的不需要整个东西,但也许只是一个从.bmp中抓取每个像素并将像素的颜色输出到文件或其他东西中的示例。我的c ++有点生疏(最近一直在做java和javscript)。
如果你想阅读一个已知格式的BMP并且不关心它是如何完成的(即,只有内部的事情),你可以只获取BMP,忽略标题并将其用作像素数组。它从左下角开始逐行存储。它的包装方式有一些细节障碍,但根据我的经验,如果你拍摄 32bpp 的图像,它可以完全忽略。
举个非常简单的例子:
unsigned int *buffer;
void readfile() {
FILE *f = fopen("file.bmp", "rb");
buffer = new unsigned int[132*65];
fseek(f, 54);
fread(buffer, 132*65*4, 1, f);
fclose(f);
}
unsigned int getpixel(int x, int y) {
//assuming your x/y starts from top left, like I usually do
return buffer[(64 - y) * 132 + x];
}
我遇到了同样的问题,但是通过阅读BMP文件格式说明,我编写了一个函数,该函数读取.BMP文件并将其存储到数组中。也许这个函数可以帮助你:
unsigned int PIC::BinToNum(char *b,int bytes)
{
unsigned int tmpx = 0;
unsigned int pw = 1;
for(int i=0;i<bytes;i++)
{
tmpx += ((unsigned char)b[i]* pw);
pw = pw * 256;
}
return tmpx;
}
int PIC::Open(const char *path)
{
int pad = 0;
unsigned int sof = 0;
unsigned int tx = 0;
char tmp[4] = {0,0,0,0};
fstream file;
file.open(path,ios::in);
if(file.fail())
{
width=height=ColorBits=size=0;
return -1;
}
else
{
file.seekg(0,ios::beg);
file.read(tmp,2);
if(!(tmp[0] == 66 && tmp[1] == 77))
{
width=height=ColorBits=size=0;
return 0;
}
else
{
file.seekg(2,ios::beg); // 0x2 size
file.read(tmp,4);
size = BinToNum(tmp,4);
file.seekg(18,ios::beg); // 0x12 width
file.read(tmp,4);
width = BinToNum(tmp,4);
file.seekg(22,ios::beg); // 0x16 height
file.read(tmp,4);
height = BinToNum(tmp,4);
file.seekg(28,ios::beg); // 0x1C Bits per Pixel
file.read(tmp,2);
ColorBits = BinToNum(tmp,2);
file.seekg(10,ios::beg); // 0x0A start offset
file.read(tmp,4);
sof=BinToNum(tmp,4);
file.seekg(34,ios::beg); // 0x22 Padding
file.read(tmp,4);
pad = BinToNum(tmp,4);
pad = (int)(pad / height); // Compute Spacing in each row
pad = pad - (width*ColorBits/8);
// Initialize Matrix//
matrix = new(unsigned int[height*width]);
for(int h=height-1;h>=0;h--)
{
for(int w=0;w<=width-1;w++)
{
file.seekg(sof,ios::beg);
file.read(tmp,(int)(ColorBits/8));
tx = BinToNum(tmp,(int)(ColorBits/8));
matrix[(h*width)+w] = tx;
sof+=(int)(ColorBits/8);
}
sof +=pad;
}
}
}
file.close();
return 1;
}
Note:This functions is member of a class that i named it "PIC"...
相关文章:
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 基于字节数组生成静态范围整数值
- 将字节数组转换为带有字节序问题的指针
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 swig 追加到字节数组
- C++ 替换字节数组中项的顺序
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 如何通过libpq c api插入字节的数组
- i2c中的字节指针数组
- 以 C++ 为单位递增 16 字节字符数组
- new[] 一个包含构造函数的字节对象数组没有错,对吧?
- 创建未知长度的字节/字符数组
- 我如何将bitset转换为字节/uint8数组
- C++ <--> C# 修改字节编组数组
- 将m个字节的数组拆分为n个字节的块
- c++到c#:有3个元素的字节指针数组等于什么?