我正在尝试调整位图文件的大小。该文件只是从命令提示符获取的常规文件,采用一个整数来确定文件的大小调整大小,并且一旦被接收,就会被处理并输出该文件的已调整大小的图像。我觉得我很亲近,但并不总是很重要。这是我的代码:
for (int i = 0, BHeight=abs(bi.biHeight);i<BHeight; i++)
{
buffer = malloc(sizeof(RGBTRIPLE) * bi.biWidth);
// iterate over pixels in scanline
for (int j = 0; j < bi.biWidth; j++)
{
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
// temporary storage
for (int k=0; i<factor;k++)
{
buffer[k]=triple;
}
} //iterate over each pixel factor times
// write RGB triple to outfile
for(int i=0;i<factor;i++)
{
fwrite(&buffer[i], sizeof(RGBTRIPLE),1,outptr);
}
}
也许有人可以引导我朝着正确的方向前进。另外,我故意没有发布所有代码。但如果需要一切来诊断问题,请告诉我。
答案 0 :(得分:3)
您的I / O很可怕,您可能应该在开始处理之前将所有图像加载到内存中。
大多数缩放算法都需要对相邻像素进行2D访问;一次缩放一条扫描线使得无法正确过滤并产生不良结果。
此外,当然,您必须修改位图文件的标题,并在缩放后发出正确调整的标题。
答案 1 :(得分:1)
for (int k = 0; i < factor; k++)
{
buffer[**k**] = triple;
}
首先更改k
中的变量buffer[k]
,您必须初始化一个新变量buffer[*]
,该值等于循环运行的次数,
否则,如果循环继续,缓冲区的值将覆盖。
在下面的代码中
// write RGB triple to outfile
for(int i = 0; i < factor; i++)
{
fwrite(&buffer[i], sizeof(RGBTRIPLE), 1, outptr);
}
您不需要在buffer[i]
中使用缓冲区的索引,因为当fwrite
函数写入outfile时,光标会自动切换到下一个空白位置,就像您键盘输入一样,光标自动向右移动。
而且,现在您要编写一个扫描行或行,将因子时间写入outfile,因此需要使用bi.biWidth
{}}}的1
。
因为你需要写一整行或scanline
而不是一个像素。
因此,您更正后的代码会喜欢:
// iterate over pixels in scanline
for (int j = 0; j < bi.biWidth; j++)
{
int cur = 0;
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
// temporary storage
for (int k = 0; i < factor; k++)
{
buffer[cur] = triple;
cur++;
}
} //iterate over each pixel factor times
// write RGB triple to outfile
for (int i = 0; i < factor; i++)
{
fwrite(&buffer, sizeof(RGBTRIPLE), bi.biWidth, outptr);
}
希望这会对你有所帮助