BMP未压缩

时间:2013-10-23 21:36:32

标签: c unix 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;
}

1 个答案:

答案 0 :(得分: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++;
    }
}