更新:代码现在可以了,请参阅问题末尾的编辑
我正在编写一个简单的应用程序,它应该缩放给定的图像并在屏幕上显示结果。图像加载、显示等是通过 SDL 实现的,但缩放功能仍然存在问题 - 它会产生乱码。
我必须对 24 位图像进行操作,因此需要 uint8_t 转换和逐字节计算。
#include <stdint.h>
void blin(uint8_t* pixelsIn, uint8_t* pixelsOut, int w, int h, float scale)
{
int index1, index2;
int w2, h2;
int i, j, k;
float x, y;
float t;
int p1, p2;
w2 = (int)(scale*w + 0.5);
h2 = (int)(scale*h + 0.5);
p1 = w*3;
if(p1%4) p1 += (4-p1%4);
p2 = w2*3;
if(p2%4) p2 += (4-p2%4);
for(i=0;i<h2;i++) //line
{
index2=i*p2;
for(j=0;j<w2;j++) //column
{
x=((float)(j))/scale;
index1=(int)(x) * 3;
x-=(int)(x);
y=((float)(i))/scale;
index1+=(int)(y) * p1;
y-=(int)(y);
for(k=0;k<3;k++) //for color in R, G, B
{
t = (float)(pixelsIn[index1]) * (1.0-x)*(1.0-y);
t += (float)(pixelsIn[index1+3]) * (x)*(1.0-y);
t += (float)(pixelsIn[index1+p1]) * (1.0-x)*(y);
t += (float)(pixelsIn[index1+p1+3]) * (x)*(y);
pixelsOut[index2] = (uint8_t)(t);
index1++;
index2++;
}
}
}
}
编辑:明显的错误,index2 没有归零,x 的计算没有乘以 3(每像素字节数)。但是图像仍然没有正确缩放,这是在 scale=1.0 之前和之后(jpgs 只是为了更快的上传):
- 之前:http: //i.stack.imgur.com/TZLF4.jpg
- 之后:http: //i.stack.imgur.com/IWKfh.jpg
Edit2:第二个问题是 SDL_Surface 像素结构内的 4 字节对齐。现在它就像一个魅力(这里的代码已更新),虽然它只适用于 24 位图像 - 请参阅最佳答案的评论。