我有一个BGR格式和分辨率为1920 * 1200的位图,并希望在不更改pixelformat的情况下缩放它。
private Bitmap rescale(Size size, Bitmap origin)
{
Bitmap scaled = new Bitmap(origin, size);
return scaled;
}
问题是,缩放结果是一个RGBA位图(所有alphas都在255),这对我来说不仅没用,而且还困扰我,因为后来我在不同的图像上做了一个AbsDiff(来自EMGU)那么,alpha值总是变为零.. 有没有办法在缩放时不改变pixelformat或在没有alpha值的情况下进行AbsDiff?因为像这样,当我稍后加载图像时,它是不可见的..
答案 0 :(得分:6)
Bitmap scaled = new Bitmap(origin, size);
构造函数调用中内置了许多隐式假设。你会得到:
显然你不高兴,第一颗子弹是你投诉的来源。写出所有细节都可以调整:
public static Bitmap RescaleImage(Image source, Size size) {
// 1st bullet, pixel format
var bmp = new Bitmap(size.Width, size.Height, source.PixelFormat);
// 2nd bullet, resolution
bmp.SetResolution(source.HorizontalResolution, source.VerticalResolution);
using (var gr = Graphics.FromImage(bmp)) {
// 3rd bullet, background
gr.Clear(Color.Transparent);
// 4th bullet, interpolation
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.DrawImage(source, new Rectangle(0, 0, size.Width, size.Height));
}
return bmp;
}
答案 1 :(得分:5)
我会这样做的(不可否认的一种丑陋)方法是用原始的Pixelformat和新的Size创建一个新的Bitmap并将原始位图绘制到它上面(未经测试):
private Bitmap rescale(Size size, Bitmap origin)
{
Bitmap rescaled = new Bitmap(size.Width, size.Height, origin.PixelFormat);
using(Graphics g = Graphics.FromImage(rescaled))
{
g.DrawImage(origin, 0, 0, size.Width, size.Height);
}
return rescaled;
}
答案 2 :(得分:-3)
这似乎是你需要的: http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save
和
public Bitmap(
Image original,
Size newSize
)
这是一个采用新大小的构造函数。图像会自动调整为该大小。