位图传输时如何保持目标表面的原始形状?
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!
看看下面的截图。显示了三个薄的 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!