我想在 C SDL 中放大图像

I want to zoom in an image in C SDL

提问人:Iupyou 提问时间:11/1/2023 最后编辑:genpfaultIupyou 更新时间:11/2/2023 访问量:70

问:

我需要拍摄图像 m * m 并返回图像 n * n。

我有这个代码:

void Zoom_Filter(SDL_Surface* surface)

int newsize = 28;

Uint32* pixels = surface -> pixels;
Uint32* pixels2 =  malloc(newsize*newsize*sizeof(Uint32));

int cote = surface -> w;


double Zoom = ((double)newsize)/(double)cote;

for(int i = 0; i < newsize; i++)
{
    for(int j = 0; j < newsize; j++)
    {
        int X = j/Zoom;
        int Y = i/Zoom;
        Uint32 px = pixels[(Y*cote + X)];
        pixels2[i * newsize + j] = px;
    }
}

surface -> w = newsize;
surface -> h = newsize;
surface -> pixels = pixels2;

但是,它不能很好地工作:

enter image description here

结果:

enter image description here

C 缩放 SDL SDL-2

评论

0赞 greg spears 11/1/2023
你的代码似乎没问题,所以我认为这是你的算法。有很多方法可以缩放,不确定您更喜欢哪种方法。我能给你的最好的建议是推荐一个网络搜索 - 你想要像这样的关键字“rescale”或“resize”和“image”和“c/c++”。请注意,一些命中就在 stackoverflow 上。
0赞 Iupyou 11/1/2023
我很确定他们使用相同的算法,当然我可以使用双线性来使其更平滑,但是当我添加它时,问题完全相同。
0赞 greg spears 11/1/2023
嗨@Iupyou -- 我发现实际上您的代码工作正常。请在此处查看代码的重新创建 - 只要您提供方形位图(即:20x20、10x10 等),它似乎工作得很好。非正方形,可能会失败。
1赞 Iupyou 11/1/2023
我已经验证了图像是一个正方形,测试printf(“%i,%i”,surface -> w,surface -> h);不幸的是,这些值是相同的。
1赞 Iupyou 11/3/2023
我说我已经找到了错误,但如果你愿意:100 * 100到28 * 28

答:

0赞 Iupyou 11/2/2023 #1

我已经找到了答案。 我认为 SDL 在直接修改图像大小和像素列表大小时存在一些问题。 为了使它工作,我刚刚创建了一个新表面。 谢谢你的帮助。