繁体   English   中英

调整图片大小vc ++

[英]Resizing a picture vc++

在Visual C ++中,有没有可以快速调整图片大小的功能? 我想制作一个原始图片的副本,该副本要小x倍。 然后,我想将其放置在黑色位图的中心。 黑色位图的大小将为第一张图片的大小。

这是原始图片: https : //www.dropbox.com/s/6she1kvcby53qgz/term.bmp

这是我想收到的效果: https : //www.dropbox.com/s/8ah59z0ip6tq4wd/term2.bmp

在我的程序中,我使用Pylon的库。 图像为CPylonImage类型。

一些简单的代码可移植地调整大小:

在所有情况下,以下图例均适用:

  • w1-原始图像的宽度
  • h1-原始图像的高度
  • int具有像素数据的int数组
  • w2-所需宽度
  • h2-所需高度
  • retval-这是返回的值,它是一个包含操纵图像的新像素数组。

对于线性插值:

我目前无法在驱动器上找到此文件(带有新硬盘的问题),因此包含了Bilinear:

对于双线性插值:

双线性插值函数

双线性插值函数

int* resizeBilinear(int* pixels, int w1, int h1, int w2, int h2) 
{
    int* retval = new int[w2*h2] ;
    int a, b, c, d, x, y, index ;
    float x_ratio = ((float)(w1-1))/w2 ;
    float y_ratio = ((float)(h1-1))/h2 ;
    float x_diff, y_diff, blue, red, green ;
    int offset = 0 ;
    for (int i=0;i<h2;i++) {
        for (int j=0;j<w2;j++) {
            x = (int)(x_ratio * j) ;
            y = (int)(y_ratio * i) ;
            x_diff = (x_ratio * j) - x ;
            y_diff = (y_ratio * i) - y ;
            index = (y*w1+x) ;                
            a = pixels[index] ;
            b = pixels[index+1] ;
            c = pixels[index+w1] ;
            d = pixels[index+w1+1] ;

            // blue element
            // Yb = Ab(1-w1)(1-h1) + Bb(w1)(1-h1) + Cb(h1)(1-w1) + Db(wh)
            blue = (a&0xff)*(1-x_diff)*(1-y_diff) + (b&0xff)*(x_diff)*(1-y_diff) +
                   (c&0xff)*(y_diff)*(1-x_diff)   + (d&0xff)*(x_diff*y_diff);

            // green element
            // Yg = Ag(1-w1)(1-h1) + Bg(w1)(1-h1) + Cg(h1)(1-w1) + Dg(wh)
            green = ((a>>8)&0xff)*(1-x_diff)*(1-y_diff) + ((b>>8)&0xff)*(x_diff)*(1-y_diff) +
                    ((c>>8)&0xff)*(y_diff)*(1-x_diff)   + ((d>>8)&0xff)*(x_diff*y_diff);

            // red element
            // Yr = Ar(1-w1)(1-h1) + Br(w1)(1-h1) + Cr(h1)(1-w1) + Dr(wh)
            red = ((a>>16)&0xff)*(1-x_diff)*(1-y_diff) + ((b>>16)&0xff)*(x_diff)*(1-y_diff) +
                  ((c>>16)&0xff)*(y_diff)*(1-x_diff)   + ((d>>16)&0xff)*(x_diff*y_diff);

            retval[offset++] = 
                    0xff000000 | // hardcoded alpha
                    ((((int)red)<<16)&0xff0000) |
                    ((((int)green)<<8)&0xff00) |
                    ((int)blue) ;
        }
    }
    return retval;
} 

对于最近的邻居:

int* resizePixels(int* pixels,int w1,int h1,int w2,int h2) 
{
    int* retval = new int[w2*h2] ;
    // EDIT: added +1 to remedy an early rounding problem
    int x_ratio = (int)((w1<<16)/w2) +1;
    int y_ratio = (int)((h1<<16)/h2) +1;
    //int x_ratio = (int)((w1<<16)/w2) ;
    //int y_ratio = (int)((h1<<16)/h2) ;
    int x2, y2 ;
    for (int i=0;i<h2;i++) {
        for (int j=0;j<w2;j++) {
            x2 = ((j*x_ratio)>>16) ;
            y2 = ((i*y_ratio)>>16) ;
            retval[(i*w2)+j] = pixels[(y2*w1)+x2] ;
        }                
    }                
    return retval;
}

现在,上面的代码被设计为可移植的,并且在C ++,C,C#和Java中进行的修改很少(我在需要时已对所有4种代码使用了上面的代码),从而消除了对外部库的需求,并允许您处理任何像素数组,只要您可以使用上面代码的格式表示它们即可。

要将经过处理的图像放置在黑色背景的中间,您需要做的就是将数据复制到原始位置正确位置的数组中,并用black的值填充所有其他位置:)

希望这会有所帮助,因为我目前没有时间对此进行评论,但是如果需要,可以在今天或明天稍后进行:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM