Visual c++ 我有一个RGBA图像文件,我想用C++;

Visual c++ 我有一个RGBA图像文件,我想用C++;,visual-c++,bmp,rgba,Visual C++,Bmp,Rgba,我对解释图像格式是新手。 我读过关于imagemagick的书,但是有没有其他我可以使用的库? 或者它很像读取rgba文件并重新排列数据。有代码片段吗? 这里的任何帮助都会大有裨益 编辑:我写了下面的代码将RGBA图像转换为BMP,但输出图像在查看时无效。我能在这里得到帮助吗? 由@bRad Gibson推荐的帖子 #包括 #包括 #包括 #包括 #包括 使用名称空间std; typedef无符号字符字节;//1字节 typedef无符号短字;//2字节单位16 typedef无符号长双字//4

我对解释图像格式是新手。 我读过关于imagemagick的书,但是有没有其他我可以使用的库?
或者它很像读取rgba文件并重新排列数据。有代码片段吗? 这里的任何帮助都会大有裨益

编辑:我写了下面的代码将RGBA图像转换为BMP,但输出图像在查看时无效。我能在这里得到帮助吗? 由@bRad Gibson推荐的帖子

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
typedef无符号字符字节;//1字节
typedef无符号短字;//2字节单位16
typedef无符号长双字//4字节uint32\u t
typedef无符号长整长;
结构BMP
{
BMP();
结构
{
单词ID;
DWORD文件大小字节;
保留字1;
保留字2;
DWORD像素阵列ffsetinBytes;
}文件头;
枚举类压缩方法:DWORD{BIU RGB=0x00,
BI_RLE8=0x01,
BI_RLE4=0x02,
BI_位字段=0x03,
BI_JPEG=0x04,
BI_PNG=0x05,
BI_字母位字段=0x06};
结构
{
DWORD headerSizeInBytes;
DWORD位图宽度像素;
DWORD位图高度像素;
字数;
单词bitsPerPixel;
压缩法;压缩法;
DWORD位图大小字节;
int32_t水平分辨率像素渗透计;
int32_t垂直分辨率像素渗透计;
德沃德·帕莱特;
德沃德重要颜色计数;
}双割台;
};
BMP::BMP()
{
//初始化字段
FileHeader.ID=0x4d42;//='BM'(小尾端)
FileHeader.reserved1=0;
FileHeader.reserved2=0;
FileHeader.pixelArrayOffsetInBytes=sizeof(FileHeader)+sizeof(DIBHeader);
DIBHeader.headerSizeInBytes=40;
DIBHeader.colorPlaneCount=1;
DIBHeader.bitsPerPixel=32;
DIBHeader.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”;
//读取RGBA文件
ifstream readRGBA(rgbaFilename,ios::binary);
如果(!readRGBA)
返回0;
向量缓冲区((
std::istreambuf_迭代器(readRGBA)),
(std::istreambuf_迭代器());
//Construct.bmp
BMP;
size\u t charCount=buffer.size();
bmp.DIBHeader.bitmapSizeInBytes=charCount*sizeof(缓冲区[0]);
bmp.FileHeader.fileSizeInBytes=bmp.FileHeader.pixelArrayOffsetInBytes+bmp.DIBHeader.bitmapSizeInBytes;
bmp.DIBHeader.bitmapWidthInPixels=静态强制转换(ceil((sqrt((float)charCount));
bmp.DIBHeader.bitmapHeightInPixels=static_cast(ceil(charCount/static_cast(bmp.DIBHeader.bitmapWidthInPixels));
std::ofstreamwritebmp(位图文件名,std::ofstream::binary);
如果(!writeBMP)
返回0;
writeBMP.write(reinterpret_cast(&bmp),sizeof(bmp));
writeBMP.write(reinterpret_cast(&buffer[0]),bmp.DIBHeader.bitmapSizeInBytes);
返回0;
}

有许多图像库用于转换图像数据。正如您所注意到的,就是这样一个库,它能够将原始(RGB[A])数据转换为BMP

但是,与许多其他图像格式相比,该格式相对简单。只需少量代码即可将原始数据转换为BMP,因此,如果您希望减少外部依赖性(例如,不使用外部代码),编写自己的BMP序列化代码并不一定保证集成外部库


有关在原始数据中读取和写入格式的简单示例,请参阅。

谢谢!上面“此处”中的超链接再次将我带到“”你能帮我找到正确的链接吗?请在上面找到我编写的编辑代码,但我得到的bmp无效。
#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;
}