1

我正在尝试调整位图文件的大小。该文件只是一个从命令提示符获取的常规文件,它采用一个整数来确定文件将被调整多少,并且一旦被接收,就会被处理并输出该文件的调整大小的图像。我觉得我很接近,但接近并不总是重要的。这是我的代码:

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); 
    } 
}  

也许有人可以引导我朝着正确的方向前进。另外,我故意没有发布所有代码。但是,如果需要一切来诊断问题,请告诉我。

4

2 回答 2

3

您的 I/O 很可怕,您可能应该在开始处理之前将所有图像加载到内存中。

大多数缩放算法都需要对相邻像素进行 2D 访问;一次缩放一条扫描线会导致无法正确过滤,并且结果会很差。

此外,当然您必须修改位图文件的标题并在缩放后发出适当调整的标题。

于 2013-04-05T07:27:16.470 回答
1
for (int k = 0; i < factor; k++)
{
    buffer[**k**] = triple;
}

首先更改变量kbuffer[k]你必须初始化一个新变量buffer[*],其值等于循环运行的次数,否则如果循环继续,缓冲区的值将被覆盖。


在下面的代码中

// write RGB triple to outfile 
for(int i = 0; i < factor; i++)
{
    fwrite(&buffer[i], sizeof(RGBTRIPLE), 1, outptr); 
}

您不需要使用缓冲区的索引 in buffer[i],因为当fwrite函数写入 outfile 时,光标会自动移动到下一个空白位置,就像您用键盘输入内容一样,光标会自动向右移动。而且,现在你假设要写一个扫描线或行,因素时间来输出文件,所以需要使用bi.biWidthinstesd 的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); 
}  

希望对你有帮助

于 2016-12-14T08:40:26.963 回答