位图传输时如何保持目标表面的原始形状?

How do I keep the original shape of the destination surface when blitting?

看看下面的截图。显示了三个薄的 SDL 2.0 表面,大致都是矩形的。

Blitting image 1 onto image 2 - get image 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);
}

生成的曲面已更改。但不是我希望的那样。

Copying alpha from image 1 to image 2 - get image 3

不确定这是怎么回事 - 有什么想法吗?

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

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

copy_alpha(Image2, Image1);

修改后的图片 1 给出了想要的结果。

Copying alpha from image 2 to image 1 - get image 3

感谢您的帮助 keltar!