2013-10-23 56 views
1

即时通讯工作在这个任务和由于某种原因,它不复制所有行。它跳过bmp的某些行,所以它不会完全放大图片。 我会非常感谢一些反馈,为什么它这样做。 我知道它必须与指针算术相关。放大BMP未压缩

int enlarge(PIXEL* original, int rows, int cols, int scale, 
     PIXEL** new, int* newrows, int* newcols) 
{ 
    *newcols = cols * scale; 
    *newrows = rows * scale; 


    /* Allocate memory for enlarged bmp */ 
    *new = (PIXEL*)malloc((*newrows)*(*newcols) * sizeof(PIXEL)); 
    if(!*new) 
    { 
     free(*new); 
     fprintf(stderr, "Could not allocate memory.\n"); 
     return 1; 
    } 

    int i,j,k,l; 
    int index = 0; 
    int counter = scale*rows; 
    PIXEL* o; 
    PIXEL* n; 


    for(i = 0; i < rows; i++) 
    { 
     for(j = 0; j < cols; j++) 
     { 

      for(k = 0; k < scale; k++) 
      { 

       o = original + (i*cols) + j; 
       index++; 
       for(l = 0; l < scale; l++) 
       { 
        n = (*new) + (i*cols*scale) + index + (counter*l); 
        *n = *o; 
       } 

      } 
     } 
    } 

    return 0; 
} 
+0

一切都OK,直到你计算'n',那么你完全失去了我。我特别想知道'索引'。 –

+0

索引帮助我指向下一个位置,其中原始值将位于我的新位图中 – Hous3aholik

回答

2

您正在将一个方块像素复制到整型缩放图像中。外部的两个循环和你的原始像素地址的计算很好。

现在,看看内部的两个循环,你有这种奇怪的事情发生在counterindex,这不太合理。我们重写一下。你需要做的就是为每一行复制一组像素。

o = original + i*cols + j; 
n = *new + (i*cols + j) * scale; 

for(sy = 0; sy < scale; sy++) 
{ 
    for(sx = 0; sx < scale; sx++) 
    { 
     n[sy*cols*scale + sx] = *o; 
    } 
} 

我真的不喜欢ijkl变量风扇。这很懒惰,没有意义。很难看到k是行还是列索引。所以我使用sxsy来表示“缩放的x和y坐标”(我会推荐使用xy而不是ji,但我保留原样)。


现在,这是一个更好的方法。复制扫描线中的像素,而不是跳过写入单个缩放块。在这里,您缩放一行,并多次执行此操作。你可以用这个替换你的四个循环:

int srows = rows * scale; 
int scols = cols * scale; 

for(sy = 0; sy < srows; sy++) 
{ 
    y = sy/scale; 
    o = original + y * cols; 
    n = *new + sy * scols; 

    for(x = 0; x < cols; x++) { 
     for(i = 0; i < scale; i++) { 
      *n++ = *o; 
     } 
     *o++; 
    } 
} 
+0

稻田非常感谢你!我没有想过这样做。再一次感谢你! – Hous3aholik

+0

没问题。不要忘记投票或接受,如果这是有用的。 – paddy