2017-09-01 13 views
-1

私はrestAPIを使用してPythonから2d numpyのrgb配列を取得しています。これをC++を使用して作成してイメージしたいと思います。またはあなたはnumpyからC++の同様のライブラリを知っていますか?2d rgb配列を持つC++でイメージを作成するにはどうすればよいですか?

+0

どのような画像ですか?それをディスクに保存して表示したいのですか? –

+0

pngまたはbmpと表示したい –

答えて

0

非常に簡単にビットマップ(.bmp拡張子)を作成できます。

https://github.com/ArashPartow/bitmapのようなライブラリを使用できます。狭いユースケースを持つライブラリは、通常かなり読みやすいです。この場合、ロジックはすべて1つのhppファイルに含まれます。それを見て、それは少し異なる複雑なケースを扱うので、少し複雑です。

または、自分で行うこともできます。バイナリのビットマップヘッダを書く方法を調べ、fstreamを使ってファイルに書き出します。 ios::out | ios::binaryを書き込むためにファイルを開くときにバイナリオプションを使用したいと思うでしょう。ビットマップヘッダとファイルフォーマットの詳細は、https://en.wikipedia.org/wiki/BMP_file_format

です。ちなみに、Wikipediaにはバイナリファイルフォーマットとビットバイビットテーブルがあります。

さまざまなフォーマットを扱わない非常に単純な実装では、これまでこれを行ってきました。

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; 
} 
関連する問題