Graphics 我如何在布点时保持目标曲面的原始形状?

Graphics 我如何在布点时保持目标曲面的原始形状?,graphics,sdl,blit,Graphics,Sdl,Blit,请看下面的屏幕截图。将显示三个薄型SDL 2.0曲面,它们或多或少都是矩形的 第一个表面(褐色的纸面)是图像1 下面缺少两个角的白色是图2 我想执行SDL_BlitSurface,以便将图像1以图像2的形状显示在图像2上(换句话说,最终结果应该看起来像牛皮纸,但缺少两个角) 为此,我尝试: SDL_BlitSurface(Image1, NULL, Image2, NULL); 但我得到的不是期望的结果,而是图片中的第三个曲面(图3),与图1相同 更新 根据keltar的建议,我用一个定

请看下面的屏幕截图。将显示三个薄型SDL 2.0曲面,它们或多或少都是矩形的

第一个表面(褐色的纸面)是图像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阿片素,npixel;
Uint8 r,g,b,a;
如果(SDL_MUSTLOCK(src))SDL_锁面(src);
如果(SDL_MUSTLOCK(dst))SDL_锁面(dst);
Uint8 srcAlpha=0;
对于(int y=0;y格式,&r,&g,&b,&a);
srcAlpha=a;
opixel=获取像素(dst,x,y);
SDL_GetRGBA(阿片素、dst->格式、r、g、b和a);
a=srcAlpha;
npixel=SDL_MapRGBA(dst->格式,r,g,b,a);
放置像素(dst、x、y、npixel);
}
如果(SDL_MUSTLOCK(src))SDL_unlock surface(src);
如果(SDL_必须锁定(dst))SDL_解锁表面(dst);
}
结果表面发生了变化,但不是我所希望的那样


不确定该怎么做-有什么想法吗?

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

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

修改后的图像1给出了期望的结果


感谢您的帮助keltar!

第三张图像是否与问题相关?您想要得到什么结果图像?是否应该有alpha通道?描述了每种格式组合的blitting工作方式。我不确定我是否理解您的意图,但听起来您只是想将alpha通道从一张图像复制到另一张图像?我希望最终图像具有第一个图像的外观,但有第二个图像的形状。相反,我得到了第三个图像-看起来正确,但形状错误。好的,但生成的图像应该有alpha通道吗?第二个图像有吗?如果两者都正确,那么你只想复制alpha,什么都没有。我不认为有blit函数可以做到这一点,但可以很容易通过循环完成。好的,我明白你的意思。原始曲面是从.png图像创建的,所以它们可能有alpha通道。我将进一步研究并发回。如果SDL 1.2可以通过blit实现这一点,那会很奇怪,但2.0需要一个定制函数。感谢指针。
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);
}
copy_alpha(Image2, Image1);