Visual C++有没有快速调整图片大小的函数?我想制作一份缩小 x 倍的原始图片拷贝。然后我想把它放在黑色位图的中心。黑色位图将是第一张图片的大小。
这里是原图:https://www.dropbox.com/s/6she1kvcby53qgz/term.bmp
这是我想要收到的效果:https://www.dropbox.com/s/8ah59z0ip6tq4wd/term2.bmp
在我的程序中,我使用了 Pylon 的库。图像是 CPylonImage 类型。
最佳答案
一些可移植地处理调整大小的简单代码:
以下图例适用于所有情况:
- w1 - 原图的宽度
- h1 - 原图的高度
- pixels - 包含像素数据的
int
数组 - w2 - 所需宽度
- h2 - 期望的高度
- retval - 这是返回值,它是一个新的像素数组,其中包含经过处理的图像。
对于线性插值:
目前我在我的驱动器上找不到这个(新硬盘的问题)所以包括了双线性:
对于双线性插值:
双线性插值函数
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 个代码都使用了上面的代码),这消除了对外部库的需要并允许您处理任何像素数组,只要您能够以上述代码的格式表示它们即可。
要将经过处理的图像放置在黑色背景的中间,您需要做的就是将数据复制到原始数组中正确位置的数组中,并使用黑色值填充所有其他位置:)
希望这会有所帮助,因为我目前没有时间对所有内容发表评论,但如果需要,我可以在今天晚些时候或明天发表评论:)
关于c++ - 调整图片大小 vc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572460/