在c

时间:2016-04-01 17:21:09

标签: c

以下代码接受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语句。在此先感谢您的帮助。

2 个答案:

答案 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);