以下代码接受bmp并放大,旋转或翻转它。除非我调用放大命令行,否则一切正常。图片出现但看起来不大。
这是扩大功能:
int enlarge(PIXEL* original, int rows, int cols, int scale,
PIXEL** new, int* newrows, int* newcols)
{
int row, col, i, j;
if((rows<=0)|| (cols<=0))
{
return -1;
}
*newrows=rows * scale;
*newcols=cols * scale;
*new=(PIXEL*)malloc((scale*rows)*(scale*cols)*sizeof(PIXEL));
for(row=0;row<rows;row++)
{
for(col=0;col<cols;col++)
{
PIXEL *o=original + row*cols +col;
for(j=0; j<scale;j++)
{
for(i=0; i<scale;i++)
{
PIXEL *n=(*new)+(row*scale+i)*(*newcols)+(col*scale+j);
*n=*o;
}
}
}
}
/* THIS IS THE METHOD THAT YOU SHOULD WRITE */
return 0;
}
这是主要功能:
int degree, scale;
int is_rotate=0, is_scale=0, is_flip=0;
char *inputFile=NULL, *outputFile=NULL;
int r, c, check;
PIXEL *b, *nb;
int nr,nc;
int error;
//readFile("example.bmp",&r,&c,&b);
while((check=getopt(argc,argv,"s:r:o:f")) != -1)
{
switch (check)
{
case 's':
is_scale=is_scale+1;
//enlarge(nb,nr,nc,optarg,&nb,&nr,&nc);
scale=atoi(optarg);
if(is_scale==2)
{
printf("bmptool: -s: scale can only be called once in commmand line");
error=1;
}
if(scale<0)
{
printf("bmptool: -s : the scale must be a positive integer");
error=1;
}
//printf("This is working s");
break;
case 'r':
is_rotate= is_rotate+1;
//rotate(b,r,c,optarg,&b,&r,&c);
degree=atoi(optarg);
if(is_rotate==2)
{
printf("bmptool: -r: rotation can only be called once in commmand line");
error=1;
}
if(degree%90 != 0)
{
printf("bmptool: -r: the degree of rotation must be a multiple of 90");
error=1;
}
//printf("this is working r");
break;
case 'f':
is_flip=is_flip+1;
if(is_flip==2)
{
printf("bmptool: -f: flip can only be called once in command line");
}
break;
case 'o':
outputFile=(optarg);
//printf(outputFile);
//readFile(outputFile,&r,&c,&b);
break;
}
}
if(error==1)
{
return 0;
}
if(is_rotate==0 && is_scale==1 && is_flip==0)
{
enlarge(nb,nr,nc,scale,&nb,&nr,&nc);
writeFile(inputFile,r,c,b);
}
我只添加了包含放大的if语句。在此先感谢您的帮助。
答案 0 :(得分:0)
如果这是标准的Windows位图,则newrows
必须是扫描线尺寸。位图图像由扫描线组成。扫描线由像素组成。像素由一个或多个组件(颜色)组成。
扫描线必须是4个字节的倍数。因此,在扫描线的最后一个像素的最后一个分量之后,可能会有一些未使用的字节。
因此,缩放的位图必须具有适当大小的扫描线。另见
Dealing with padding in a BMP file in C如何计算扫描线尺寸并迭代图像。
另请注意,如果你只是&#34;缩放&#34;使用整数,您可以缩放1,2,3 ...整数倍(100%,200%,...)。使用非整数进行缩放需要在新的宽度和高度上涂抹像素。互联网上提供了许多算法和现成的代码。
答案 1 :(得分:0)
试试这个:
int enlarge(PIXEL* original, int rows, int cols, float scale,
PIXEL** enlarged, int* newrows, int* newcols)
{
int row, col;
if((rows<=0)|| (cols<=0))
{
return -1;
}
(*newrows)=(int)((float)rows * scale);
(*newcols)=(int)((float)cols * scale);
*enlarged=(PIXEL*)malloc((*newrows)*(*newcols)*sizeof(PIXEL));
for(row=0;row<(*newrows);row++)
{
for(col=0;col<(*newcols);col++)
{
(*enlarged)[row * (*newcols) + col] = original[(row * rows / (*newrows)) * cols + col * cols / (*newcols)];
}
}
/* THIS IS THE METHOD THAT YOU SHOULD WRITE */
return 0;
}
注意:我将比例类型更改为浮点数,以便您可以在任何因子中进行缩放,但您可以将任何问题更改为int
您必须通过ref(非指针)传递newrows和newcols
编辑:功能使用
scale = 2.0f;
readFile("example.bmp",&r,&c,&b);
enlarge(b,r,c,scale,&nb,&nr,&nc);
writeFile("enlarge.bmp",nr,nc,nb);
free(nb);