2013-04-05 52 views
0

我正在尝试调整位图文件的大小。该文件只是一个从命令提示符获取的常规文件,其中包含一个整数,用于确定文件将被调整大小的大小,并且一旦接收,将处理该文件并输出该文件的已调整大小的图像。我觉得我很接近,但接近并不总是数。这里是我有的代码:需要协助调整位图文件的大小

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

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

大多数缩放算法将需要2D访问相邻像素;一次缩放一条扫描线会导致无法正确过滤,并且效果不佳。

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

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

代码,您不需要使用缓冲区的指数buffer[i],因为随着fwrite功能写入到OUTFILE,光标会自动移到下一个空白位置,像如果您通过键盘输入内容,光标会自动向右移动。 而现在你想写一个扫描线或行,因子时间outfile,所以需要使用bi.biWidth instesd的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); 
} 

希望这将帮助你