Question

Is there any function that quickly resizing a picture in Visual C++? I want to made a copy of original picture that would be x times smaller. Then I would like to placed it at the center of black bitmap. The black bitmap would be in the size of first picture.

Here is original picture: https://www.dropbox.com/s/6she1kvcby53qgz/term.bmp

and this is effect that i want to receive: https://www.dropbox.com/s/8ah59z0ip6tq4wd/term2.bmp

In my program I use Pylon's libraries. The images are in CPylonImage type.

No correct solution

OTHER TIPS

Some simple code to handle resizes portably:

For all cases the following legend applies:

  • w1 - the width of the original image
  • h1 - the height of the original image
  • pixels - an array of int with the pixel data
  • w2 - desired width
  • h2 - desired height
  • retval - this is the returned value, it is a new pixel array which contains the manipulated image.

For Linear Interpolation:

I cannot find this on my drive at present (issues with a new hdd) so have included Bilinear:

For Bilinear Interpolation:

Bilinear Interpolation function

Bilinear Interpolation function

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;
} 

For Nearest Neighbour:

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;
}

Now, the code above is designed to be portable and should work with very little modification in C++, C, C# and Java (I have used the code above for all 4 when needed), which eliminates the need for an external library and allows you to process any array of pixels, so long as you can represent them in the format for the code above.

To place the manipulated image in the middle of a black background, all you would need to do is copy the data into an array of the original at the right locations and populate all the other locations with the values for black:)

Hope this helps, as I have not time to comment it all at present, however I can if needs be at a later point today or tomorrow:)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top