【发布时间】:2016-07-08 18:25:46
【问题描述】:
给定一个由unsigned char[] 表示的单通道位图(alpha 从 0 到 255),有哪些方法可以从中生成 SDL_Texture?位图没有多余的数据。
回答
auto* surf = SDL_CreateRGBSurfaceFrom(bitmap, width, height, 8, width, 0, 0, 0, 0);
SDL_Color colors[256];
{
Uint8 v = 0;
for(SDL_Color& color: colors) {
color.r = color.g = color.b = 0xFF;
color.a = v++;
}
}
SDL_SetPaletteColors(surf->format->palette, colors, 0, 256);
auto* texture = SDL_CreateTextureFromSurface(sdl.renderer, surf);
SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND);
原问题
据我了解,首先调用SDL_CreateRGBSurfaceFrom(bitmap, width, height, depth, pitch, r, g, b, amasks)。
1) 我尝试过的一种(肮脏)方法是创建由unsigned[] 表示的原始位图的副本,其中每个 int 默认为 0xFFFFFF00,然后调用:SDL_CreateRGBSurfaceFrom(bitmap, width, height, 32, 4 * width, 0xff000000, 0xff0000, 0xff00, 0xff) 为我完成了. (不透明是白色的,并且再次透明,因为使用了 0xFF)。
但我想要另一种方式,因为这种方式需要额外的内存分配和奇怪的 for 循环。
auto pixelsNum = width * height;
auto bitmap = new unsigned[pixelsNum];
for(auto i = 0; i < pixelsNum; ++i) {
bitmap[i] = tmpBitmap[i] | 0xffffff00;
}
2) 我尝试的第二种方法是使用 depth = 8,因此我不需要分配任何新的位图,而是(需要?)一个 SDL_Pallete。
auto surf = SDL_CreateRGBSurfaceFrom(bitmap, width, height, 8, width, 0, 0, 0, 0xff);
SDL_Color colors[256];
for(int i = 0; i < 256; ++i) {
colors[i].r = colors[i].g = colors[i].b = 0xff;
colors[i].a = i;
}
SDL_SetPaletteColors(surf->format->palette, colors, 0, 256);
这在内存中要便宜得多,而且是恒定的。
所以我很感兴趣是否有更好的方法
谢谢。
【问题讨论】:
-
C++ 不是 C 不是 C++!
-
好吧,我知道不是。但 SDL 是 C,如果有人给我一个纯 C 的解决方案,它会为我工作。
-
@iwat0qs 我刚刚检查了编辑,发现您最初标记了它both。这对我来说似乎很好,因为这个问题在技术上是关于 SDL 而不是 C++。忽略我之前的评论。