在拼接时如何保持目标表面的原始形状?



看看下面的截图。显示三个薄的 SDL 2.0 表面,或多或少都是矩形的。

将图像 1 点亮到图像 2 上 - 获取图像 3

第一个表面(褐色纸(是图像1下面缺少两个角的白色表面是图像 2

我想执行一个SDL_BlitSurface,以便将图像 1 拼接到图像 2 上,但具有图像 2 的形状(换句话说,最终结果应该看起来像牛皮纸,但缺少两个角。

为此,我尝试:

SDL_BlitSurface(Image1, NULL, Image2, NULL);

但是我得到的不是想要的结果,而是图片中的第三个表面(图3(,与图1相同


更新


因此,在 keltar 的建议下,我将我的 blit 函数调用替换为对定制函数的调用,我希望将每个像素的 alpha 通道从图像 1 复制到图像 2

copy_alpha(Image1, Image2);
void IMAGETOOL::copy_alpha(SDL_Surface * src, SDL_Surface * dst)
{
int w = src->w,
h = src->h;
Uint32 opixel, npixel;
Uint8 r, g, b, a;
if (SDL_MUSTLOCK(src)) SDL_LockSurface(src);
if (SDL_MUSTLOCK(dst)) SDL_LockSurface(dst);
Uint8 srcAlpha = 0;
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++)
{
opixel = get_pixel(src, x, y);
SDL_GetRGBA(opixel, src->format, &r, &g, &b, &a);
srcAlpha = a;
opixel = get_pixel(dst, x, y);
SDL_GetRGBA(opixel, dst->format, &r, &g, &b, &a);
a = srcAlpha;
npixel = SDL_MapRGBA(dst->format, r, g, b, a);
put_pixel(dst, x, y, npixel);
}
if (SDL_MUSTLOCK(src)) SDL_UnlockSurface(src);
if (SDL_MUSTLOCK(dst)) SDL_UnlockSurface(dst);
}

生成的表面已更改。 但不是我所希望的方式。

将 alpha 从图像 1 复制到图像 2 - 获取图像 3

不知道该怎么做 - 有什么想法吗?

问题解决了。在上次更新中,我试图将 alpha 从图像 1 复制到图像 2 - 错误的方式!

但是当我使用相同的函数将 alpha 从图像 2 复制到图像 1 时(我猜这就是 keltar 对我的意义(。

copy_alpha(Image2, Image1);

修改后的图像1给出了所需的结果。

将 alpha 从图像 2 复制到图像 1 - 获取图像 3

感谢您的帮助凯尔塔!

相关内容

  • 没有找到相关文章

最新更新