gpt4 book ai didi

c++ - 如何加速我的 .bmp 类?

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:36 24 4
gpt4 key购买 nike

向大家问好:)

几天前,我终于设法创建了一个函数式 C++ 类来制作 .bmp 图像。尽管它可以正常工作(还没有错误),但它在速度方面效率不高(在我看来)。做了一些测试,看看写不同大小的图像需要多少时间,我得到了这些结果:

Image Dimensions   Time taken(in seconds)     Comparison to the 1000x1000 image
10x100 0.0491 x 1000 = 49.1 seconds
100x100 0.2471 x 100 = 24.7 seconds
100x1000 2.3276 x 10 = 23.3 seconds
1000x1000 22.515 x 1 = 22.5 seconds
1000x10000 224.76 \ 10 = 22.4 seconds

例如,10x100 图像有 1000 个像素(每个像素都有一个 ARGB channel [32 位或 4 字节])加上 header 的 54 个字节,写入 4054 个字节(字符)需要 0.05 秒。

我觉得这太慢了,因为我的电脑可以在一两秒内复制一个 ~85MB 的文件。我正在使用 fstream 进行磁盘写入,感谢任何有助于加快类(class)速度的帮助。谢谢!!!

我的类(class)叫做 SimpleBMP,它在这里(我只放了相关的函数):

#include <fstream>


class SimpleBMP{
struct PIXEL{
unsigned char A, R, G, B;
}*PixelArray;
unsigned char *BMPHEADER, *BMPINFOHEADER;
std::string DATA;
unsigned int Size_Of_BMP, Size_Of_PixelArray;
int BMP_Width, BMP_Height;

public:

void SetPixel(int Column, int Row, unsigned char A, unsigned char R, unsigned char G, unsigned char B){
PixelArray[(Row*BMP_Width)+Column].A = A;
PixelArray[(Row*BMP_Width)+Column].R = R;
PixelArray[(Row*BMP_Width)+Column].G = G;
PixelArray[(Row*BMP_Width)+Column].B = B;
};

bool MakeImage(std::string Name){
Name.append(".bmp");
std::ofstream OffFile(Name, std::ios::out|std::ios::binary);
if(OffFile.is_open()){
DATA.clear();
for(int temp = 0; temp < 14; temp++){
BMPHEADER[temp] = 0x00;
};
BMPHEADER[0] = 'B';
BMPHEADER[1] = 'M';
BMPHEADER[2] = Size_Of_BMP;
BMPHEADER[3] = (Size_Of_BMP >> 8);
BMPHEADER[4] = (Size_Of_BMP >> 16);
BMPHEADER[5] = (Size_Of_BMP >> 24);
BMPHEADER[10] = 0x36;



for(int temp = 0; temp < 40; temp++){
BMPINFOHEADER[temp] = 0x00;
};
BMPINFOHEADER[0] = 0x28;

for(int temp = 0; temp < 4; temp++){
BMPINFOHEADER[temp+4] = (BMP_Width >> (temp*8));
};
for(int temp = 0; temp < 4; temp++){
BMPINFOHEADER[temp+8] = (BMP_Height >> (temp*8));
};
BMPINFOHEADER[12] = 0x01;
BMPINFOHEADER[14] = 0x20;

for(int temp = 0; temp < 4; temp++){
BMPINFOHEADER[temp+20] = (Size_Of_PixelArray >> (temp*8));
};
BMPINFOHEADER[24] = 0x13;
BMPINFOHEADER[25] = 0x0b;
BMPINFOHEADER[28] = 0x13;
BMPINFOHEADER[29] = 0x0b;



for(int temp = 0; temp < 14; temp++){
DATA.push_back(BMPHEADER[temp]);
};
for(int temp = 0; temp < 40; temp++){
DATA.push_back(BMPINFOHEADER[temp]);
};
for(int temp = 0; temp < (Size_Of_PixelArray/4); temp++){
DATA.push_back(PixelArray[temp].B);
DATA.push_back(PixelArray[temp].G);
DATA.push_back(PixelArray[temp].R);
DATA.push_back(PixelArray[temp].A);
};
OffFile.write(DATA.c_str(), Size_Of_BMP);
OffFile.close();
return true;
}
else
return false;
};

};

最佳答案

运行测试时,您应该在发布 模式下编译您的项目。在大多数环境中,调试 模式会引入额外的检查和代码。链接的调试 库还可以包括额外的检查,例如发布 模式中不存在的迭代器的边界检查和验证。所有这些都会带来 Release模式中不存在的性能影响。

您还可以应用其他优化,例如在加载数据之前在 DATA 中保留内存。这将减少扩展缓冲区时需要制作的拷贝数。尽管性能提升可能并不显着,但绝对有帮助。我建议通过分析器运行您的代码,以查看所有瓶颈所在并相应地进行优化。

关于c++ - 如何加速我的 .bmp 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18036067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com