需要帮助调整位图文件的大小

时间:2013-04-05 07:21:10

标签: c

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

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

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

2 个答案:

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

希望这会对你有所帮助