【发布时间】:2020-04-30 13:05:42
【问题描述】:
我的任务是用给定的因子缩放 bmp 图片:
流:base64 bmp 图像代码:
Qk1CAAAAAAAAADYAAAAoAAAABAAAAAEAAAABABgAAAAAAAwAAAAjLgAAIy4AAAAAAAAAAAAA/////wAAAP8AAAAA
scale.c
struct bmp_image* scale(const struct bmp_image* image, float factor){
if(image == NULL || factor <= 0){
return NULL;
}
.........
int width = bmp->header->width;
int height = bmp->header->height;
int widthNew = (int)round((float)width * factor);
int heightNew = (int)round((float)height * factor);
for (uint32_t y = 0; y < heightNew; y++){
for(uint32_t z = 0; z< widthNew; z++){
bmp->data[(y*widthNew)+z].red=image->data[(int)(floor((float)y/(float)factor)*width+floor((float)z/(float)factor))].red;
bmp->data[(y*widthNew)+z].green=image->data[(int)(floor((float)y/(float)factor)*width+floor((float)z/(float)factor))].green;
bmp->data[(y*widthNew)+z].blue=image->data[(int)(floor((float)y/(float)factor)*width+floor((float)z/(float)factor))].blue;
}
}
return bmp;
}
main.c
FILE *output_p8 = fopen("scale.bmp", "w");
struct bmp_image* newimage8 = NULL;
newimage8 = scale(image, 1.025656);
free_bmp_image(image);
write_bmp(output_p8,newimage8);
free_bmp_image(newimage8);
fclose(output_p8);
数据输出我之后得到的:
ffffff ffffff ff0000 00ff00
我应该拥有的数据:
ffffff ff0000 00ff00 000000
有什么建议吗?
【问题讨论】:
-
计算新宽度时,会四舍五入到下一个整数。因此,图像的有效缩放因子不是标称因子。您必须调整您的因子或(也许更好)通过新旧宽度进行所有计算:
znew = zold * wnew / wold。在您的示例中,您将 1×4 像素位图缩放 1.025656 倍。您的新尺寸基本相同,因此您不缩放图像,但第二个像素的新索引是floor(1 / 1.025656),它是 0 而不是 1。 -
您的 for 循环中的索引超出范围。旧的宽度和高度更小,因此通过在循环中使用 y,z 和旧的宽度和高度,您的索引超出范围。您也永远不会增加实际的像素数
-
@MOehm 你能帮我解释一下
znew = zold * wnew / wold是什么@ -
它们是新旧z索引和宽度,可以读作
z_new = z_old * w_new / w_old。我没有使用您的命名法,因为长词在 cmets 中效果不佳。无论如何,您不会使用新索引,而是使用长而重复的表达式。
标签: c resize structure scale bmp