2017-01-07 2 views
0

Je suis novice dans l'interprétation des formats d'image. J'ai lu à propos de imagemagick mais y at-il d'autres bibliothèques disponibles que je peux utiliser?
Ou est-ce un peu comme lire le fichier rgba et réorganiser les données. un extrait de code? Toute aide ici serait d'une grande aide.J'ai un fichier image RGBA que je veux convertir en BMP en C++

EDIT: J'ai écrit ci-dessous du code pour convertir l'image RGBA en BMP mais l'image de sortie n'est pas valide lors de la visualisation. Puis-je obtenir de l'aide ici? après Référé par @bRad Gibson IntegerfileToBMP

#include <iostream> 
#include <fstream> 
#include <cstdint> 
#include <iterator> 
#include <vector> 
using namespace std; 

typedef unsigned char BYTE; // 1byte 
typedef unsigned short WORD; // 2bytes uint16_t 
typedef unsigned long DWORD; //4bytes uint32_t 
typedef unsigned long int LONG; 

struct BMP 
{ 
    BMP(); 
    struct 
    { 
     WORD ID; 
     DWORD fileSizeInBytes; 
     WORD reserved1; 
     WORD reserved2; 
     DWORD pixelArrayOffsetInBytes; 
    } FileHeader; 

    enum class CompressionMethod : DWORD { BI_RGB    = 0x00, 
               BI_RLE8    = 0x01, 
               BI_RLE4    = 0x02, 
               BI_BITFIELDS  = 0x03, 
               BI_JPEG    = 0x04, 
               BI_PNG    = 0x05, 
               BI_ALPHABITFIELDS = 0x06 }; 

    struct 
    { 
     DWORD headerSizeInBytes; 
     DWORD bitmapWidthInPixels; 
     DWORD bitmapHeightInPixels; 
     WORD colorPlaneCount; 
     WORD bitsPerPixel; 
     CompressionMethod compressionMethod; 
     DWORD bitmapSizeInBytes; 
     int32_t horizontalResolutionInPixelsPerMeter; 
     int32_t verticalResolutionInPixelsPerMeter; 
     DWORD paletteColorCount; 
     DWORD importantColorCount; 
    } DIBHeader; 
}; 

BMP::BMP() 
{ 
    //Initialized fields 
    FileHeader.ID         = 0x4d42; // == 'BM' (little-endian) 
    FileHeader.reserved1       = 0; 
    FileHeader.reserved2       = 0; 
    FileHeader.pixelArrayOffsetInBytes    = sizeof(FileHeader) + sizeof(DIBHeader); 
    DIBHeader.headerSizeInBytes      = 40; 
    DIBHeader.colorPlaneCount      = 1; 
    DIBHeader.bitsPerPixel       = 32; 
    DIBHeader.compressionMethod      = CompressionMethod::BI_RGB; 
    DIBHeader.horizontalResolutionInPixelsPerMeter = 2835; // == 72 ppi 
    DIBHeader.verticalResolutionInPixelsPerMeter = 2835; // == 72 ppi 
    DIBHeader.paletteColorCount      = 0; 
    DIBHeader.importantColorCount     = 0; 
} 

int main() 
{ 
    const std::string rgbaFilename = "rgbaFile.rgba"; 
    const std::string bitmapFilename = "bitmapFile.bmp"; 

    //Read RGBA file 
    ifstream readRGBA(rgbaFilename, ios::binary); 

    if(!readRGBA) 
     return 0; 

    std::vector<char> buffer((
      std::istreambuf_iterator<char>(readRGBA)), 
      (std::istreambuf_iterator<char>())); 

    //Construct .bmp 
    BMP bmp; 
    size_t charCount = buffer.size(); 

    bmp.DIBHeader.bitmapSizeInBytes = charCount * sizeof(buffer[ 0 ]); 
    bmp.FileHeader.fileSizeInBytes = bmp.FileHeader.pixelArrayOffsetInBytes + bmp.DIBHeader.bitmapSizeInBytes; 
    bmp.DIBHeader.bitmapWidthInPixels = static_cast<uint32_t>(ceil((sqrt((float)charCount)))); 
    bmp.DIBHeader.bitmapHeightInPixels = static_cast<uint32_t>(ceil(charCount/static_cast<float>(bmp.DIBHeader.bitmapWidthInPixels))); 

    std::ofstream writeBMP(bitmapFilename, std::ofstream::binary); 

    if(!writeBMP) 
     return 0; 

    writeBMP.write(reinterpret_cast< char * >(&bmp), sizeof(bmp)); 
    writeBMP.write(reinterpret_cast< char * >(&buffer[ 0 ]), bmp.DIBHeader.bitmapSizeInBytes); 
    return 0; 
} 

Répondre

0

Il existe de nombreuses bibliothèques d'images pour convertir des données d'image. Comme vous l'avez noté, ImageMagick est une telle bibliothèque qui est capable de convertir les données RAW (RGB [A]) en BMP.

Cependant, le format BMP est relativement simple, comparé à de nombreux autres formats d'image. Les données RAW peuvent être converties en BMP avec une petite quantité de code, donc si vous souhaitez réduire vos dépendances externes (par exemple, n'utilisez pas de code externe), écrire votre propre code de sérialisation BMP ne garantit pas nécessairement l'intégration d'une bibliothèque externe.

Voir here pour un exemple simple qui lit et écrit le format de/à des données RAW.

+0

Merci! Ci-dessus un lien hypertexte dans "ici" me ramène à "https://en.wikipedia.org/wiki/BMP_file_format" Pourriez-vous m'aider avec le lien correct? – Midas

+0

S'il vous plaît trouver ci-dessus mon édition avec le code que j'ai écrit, mais le bmp que je reçois est invalide. – Midas