我正在处理这项任务,由于某种原因它不会复制所有行。它会跳过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 :(得分:2)
您正在将方块像素复制到整数缩放图像中。外部的两个循环和原始像素地址的计算都很好。
现在,看看内部的两个循环,你会发现counter
和index
这个奇怪的事情并不合理。让我们改写一下。您需要做的就是为每一行复制一组像素。
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;
}
}
我真的不喜欢i
,j
,k
和l
等变量。它很懒惰,没有任何意义。很难看出k
是行索引还是列索引。所以我使用sx
和sy
表示“缩放的x和y坐标”(我建议使用x
和y
代替j
和i
但我按原样离开了。)
现在,这是一个更好的方法。复制扫描行中的像素,而不是跳转写入单个缩放块。在这里,您可以缩放单行,并多次执行此操作。你可以用这个替换你的四个循环:
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++;
}
}