我有以下代码
int oswidth = 0;
int osheight = 0;
if (comboBox3.SelectedIndex == 0)
{
oswidth = Convert.ToInt32(textBox5.Text.ToString());
osheight = Convert.ToInt32(textBox6.Text.ToString());
}
else if (comboBox3.SelectedIndex == 1)
{
oswidth = 38 * Convert.ToInt32(textBox5.Text.ToString());
osheight = 38 * Convert.ToInt32(textBox6.Text.ToString());
}
Bitmap oldimg = new Bitmap(pictureBox3.Image);
Bitmap objBitmap = new Bitmap(oldimg, new Size(oswidth, osheight));
objBitmap.Save(pictureBox3.ImageLocation.ToString(), ImageFormat.Jpeg);
问题是当所选索引为0时,它可以正常工作
但是当所选索引为1时,我收到错误“参数无效。”
我尝试了不同的图像但同样的错误。它是乘以32的东西
答案 0 :(得分:2)
尝试创建位图时出现Parameter is not valid
错误消息通常意味着您正在尝试为其分配过多内存。位图需要bit-depth*width*height/8
字节的连续内存,而且还没有足够的可用来满足这一要求。
在这种情况下,它看起来像是因为你将它的尺寸乘以38(因此将内存中的尺寸乘以38 ^ 2)。
答案 1 :(得分:1)
您可以使用以下方法:
private static void ResizeImage(string file, double vscale, double hscale, string output)
{
using(var source = Image.FromFile(file))
{
var width = (int)(source.Width * vscale);
var height = (int)(source.Height * hscale);
using(var image = new Bitmap(width, height, PixelFormat.Format24bppRgb))
using(var graphic = Graphics.FromImage(image))
{
graphic.SmoothingMode = SmoothingMode.AntiAlias;
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.DrawImage(source, new Rectangle(0, 0, width, height));
image.Save(output);
}
}
}
你可以根据自己的喜好定制,但它应该满足你的需求。
重要提示:vscale
和hscale
分开的原因是不遵循扩展规则。您可以轻松组合它们,以便相应地进行缩放。要记住的另一件事是,您使用的值为32
。尝试使用.32
的值,它将更像一个百分比,它将扩展。此外,它不会大幅增加内存,从而导致错误。