gpt4 book ai didi

c - 如何将 argb 像素阵列转换为 SDL 表面?

转载 作者:太空宇宙 更新时间:2023-11-04 04:16:31 28 4
gpt4 key购买 nike

使用 C 和 SDL2,我有一个 ARGB8888 格式的像素阵列。

Uint32 *pixels = (Uint32 *) malloc (sizeof(Uint32)*(Uint32)windowWidth*(Uint32)windowHeight);

我想将所有像素信息放入一个新的 SDL_Surface 中,准备保存为 .bmp。我该怎么做?

我不确定,因为新表面具有 RGBA8888 格式,而 sdl 转换函数需要现有表面才能转换为新表面。并且没有简单地将所有像素数组值传递到表面的函数,所以我知道它会涉及某种循环,一个一个地分配像素。

最佳答案

您可以手动将位图位保存到文件中。位图文件通常为 24 位或更少,位图查看器往往会忽略 alpha。下面的代码假定 bits 是 32 位像素。如果您需要 24 位格式,则必须将输入从 ARGB 转换为 RGB,并且还必须考虑填充。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#pragma pack(push, 1)
typedef struct my_BITMAPFILEHEADER {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
}my_BITMAPFILEHEADER;

typedef struct my_BITMAPINFOHEADER {
uint32_t biSize;
int32_t biWidth;
int32_t biHeight;
uint16_t biPlanes;
uint16_t biBitCount;
uint32_t biCompression;
uint32_t biSizeImage;
int32_t biXPelsPerMeter;
int32_t biYPelsPerMeter;
uint32_t biClrUsed;
uint32_t biClrImportant;
}my_BITMAPINFOHEADER;
#pragma pack(pop)

int copy(uint8_t* bits, int width, int height, int bitcount)
{
//compiler test:
if(sizeof(my_BITMAPFILEHEADER) != 14 && sizeof(my_BITMAPINFOHEADER) != 40)
{
printf("bitmap structures not packed properly\n");
return 0;
}

//width_in_bytes is roughly w * bytes_per_pixel, it takes padding in to account
int width_in_bytes = ((width * bitcount + 31) / 32) * 4;
uint32_t imagesize = width_in_bytes * height;
my_BITMAPFILEHEADER filehdr = { 0 };
my_BITMAPINFOHEADER infohdr = { 0 };
memcpy(&filehdr, "BM", 2);
filehdr.bfSize = 54 + imagesize;
filehdr.bfOffBits = 54;
infohdr.biSize = 40;
infohdr.biPlanes = 1;
infohdr.biWidth = width;
infohdr.biHeight = height;
infohdr.biBitCount = bitcount;
infohdr.biSizeImage = imagesize;

FILE *fout = fopen("test.bmp", "wb");
fwrite(&filehdr, sizeof(filehdr), 1, fout);
fwrite(&infohdr, sizeof(infohdr), 1, fout);
fwrite((char*)bits, 1, imagesize, fout);
fclose(fout);

return 1;
}

用法:

copy(bits, width, height, 32);
//or
copy(bits, width, height, 24);

关于c - 如何将 argb 像素阵列转换为 SDL 表面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51544411/

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