嗯,我正在使用restAPI从python中获取2d numpy rgb数组,并且我想使用C++创建它并从中创建图像。您是否有任何想法如何做到这一点?或者你知道一个类似numpy的C++库吗?如何使用2d rgb数组在C++中创建图像?
-1
A
回答
0
创建位图(.bmp扩展名)非常简单。
您可以使用库,如下所示: https://github.com/ArashPartow/bitmap。具有狭义用例的库通常非常易读。在这种情况下,逻辑全部包含在单个hpp文件中。看着它,它有点复杂,因为它处理了大量不同的情况。
或者你可以自己做。查找如何编写二进制位图头并使用fstream将其写入文件。打开文件编写ios::out | ios::binary
时,您需要使用二进制选项。您可以在这里找到位图标头和文件格式的详细信息:https://en.wikipedia.org/wiki/BMP_file_format
顺便说一下,维基百科有很多像样的二进制文件格式参考文献。
对于一个非常天真的实现,不处理一堆不同的格式,我在过去做过。
BitmapFileHeader.h
#pragma once
#include <cstdint>
#pragma pack(push, 2)
struct BitmapFileHeader
{
char header[2]{'B', 'M'};
uint32_t fileSize;
uint32_t reserved{};
uint32_t dataOffset;
};
#pragma pack(pop)
BitmapInfoHeader.h
#pragma once
#include <cstdint>
#pragma pack(push, 2)
struct BitmapInfoHeader
{
uint32_t headerSize{ 40 };
uint32_t width{ 0 };
uint32_t height{ 0 };
uint16_t planes{ 1 };
uint16_t bitsPerPixel{ 24 };
uint32_t compression{ 0 };
uint32_t dataSize{ 0 };
uint32_t horizontalResolution{ 2400 };
uint32_t verticalResolution{ 2400 };
uint32_t colors{ 0 };
uint32_t importantColors{ 0 };
};
#pragma pack(pop)
Bitmap.h
#include <string>
#include <iostream>
#include <cstdint>
#include <memory>
#include <fstream>
#include "BitmapFileHeader.h"
#include "BitmapInfoHeader.h"
using namespace std;
class Bitmap
{
private:
int m_width{ 0 };
int m_height{ 0 };
unique_ptr<uint8_t[]> m_pixels{ nullptr };
public:
struct RBG {
uint8_t r;
uint8_t b;
uint8_t g;
};
Bitmap(int width, int height) : m_width(width),
m_height(height), m_pixels(new uint8_t[width * height * sizeof(RBG)]{}) {};
void setPixel(int, int, RBG);
void setDimensions(int, int);
int getSize();
bool write(string);
~Bitmap();
};
Bitmap.cpp
#include "stdafx.h"
#include "Bitmap.h"
using namespace std;
void Bitmap::setPixel(int x, int y, RBG color)
{
uint8_t *pixel = m_pixels.get();
pixel = pixel + ((y * sizeof(RBG)) * m_width) + (x * sizeof(RBG));
// little endian
pixel[0] = color.b;
pixel[1] = color.g;
pixel[2] = color.r;
}
void Bitmap::setDimensions(int w, int h)
{
m_width = w;
m_height = h;
}
int Bitmap::getSize()
{
return m_width * m_height * sizeof(RBG);
}
bool Bitmap::write(string filename)
{
BitmapFileHeader fileHeader;
BitmapInfoHeader infoHeader;
fileHeader.fileSize = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader) + getSize();
fileHeader.dataOffset = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader);
infoHeader.width = m_width;
infoHeader.height = m_height;
ofstream file;
file.open(filename, ios::out | ios::binary);
if (!file)
{
return false;
}
file.write(reinterpret_cast<char *>(&fileHeader), sizeof(fileHeader));
file.write(reinterpret_cast<char *>(&infoHeader), sizeof(infoHeader));
file.write(reinterpret_cast<char *>(m_pixels.get()), getSize());
file.close();
return true;
}
Bitmap::~Bitmap()
{
cout << "bitmap destroyed" << endl;
}
相关问题
- 1. 从2D RGB阵列创建图像
- 2. 如何在2D数组中使用C来读取jpeg图像
- 3. 如何在Matlab中重塑1D RGB到2D RGB图像?
- 4. 如何在D中创建2D数组?
- 5. 如何使用每个像素的RGB值创建图像
- 6. 如何使用java创建RGB像素值的有效图像
- 7. 如何使用2D图像创建3D图像
- 8. C++ 2d地图?像2d数组一样?
- 9. 从RGB数据创建图像?
- 10. 如何在C++中创建int 2D数组的向量
- 11. 如何用2d数组创建方法
- 12. 如何将C#中的RGB图像转换为灰度2D 2D数组尽可能快
- 13. 如何使用Visual C++创建RGB位图?
- 14. 创建RGB图像从像素标签
- 15. 如何在Matlab中从RGB图像创建训练示例?
- 16. 如何在python中编写/创建GeoTIFF RGB图像文件?
- 17. 如何从已保存在.txt中的RGB值创建图像
- 18. 如何在C中正确地创建一个2d int数组的数组?
- 19. 使用双指针创建2d数组
- 20. 使用字符串数组在Java中创建2D(地图)数组
- 21. 如何转换4d RGB图像数据为2d阵列LogisticRegression
- 22. 从2D创建一个C数组NSArray
- 23. 2D数组 - 创建虚拟生物? (C++)
- 24. 创建一个数组图像,使其在C#中运动
- 25. 如何在opencv中将RGB图像与灰色图像组合?
- 26. 如何将2d numpy数组保存并显示为RGB伪彩色图像?
- 27. 创建一个RGB复合SAR图像
- 28. 在C++中使用2d数组交换
- 29. 在javascript中创建2d数组
- 30. 在python中创建2d数组?
什么样的图像?你想把它保存到磁盘,显示它,还有其他的东西吗? –
PNG或BMP,我想显示它 –