private void CreatePicture(System.Drawing.Image Img, int tWidth, int tHeight, string SavePath)
{
int oWidth = Img.Width; //原图宽度
int oHeight = Img.Height; //原图高度
//按比例计算出缩略图的宽度和高度
if (oWidth >= oHeight)
{
tHeight = (int)Math.Floor(Convert.ToDouble(oHeight) * (Convert.ToDouble(tWidth) / Convert.ToDouble(oWidth)));
}
else
{
tWidth = (int)Math.Floor(Convert.ToDouble(oWidth) * (Convert.ToDouble(tHeight) / Convert.ToDouble(oHeight)));
}
//生成缩略原图
System.Drawing.Bitmap tImage = new System.Drawing.Bitmap(tWidth, tHeight);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(tImage);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量插值法
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
g.Clear(System.Drawing.Color.Transparent); //清空画布并以透明背景色填充
g.DrawImage(Img, new System.Drawing.Rectangle(0, 0, tWidth, tHeight), new System.Drawing.Rectangle(0, 0, oWidth, oHeight), System.Drawing.GraphicsUnit.Pixel);
try
{
//以JPG格式保存图片
tImage.Save(SavePath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception ee) { clsFunction.StrScriptAlert("无法保存图片","SamllPicture"+ ee.Message.ToString(), false); return ; }
finally
{
//释放资源
g.Dispose();
tImage.Dispose();
//Img.Dispose();
}
}
当上传的图片很小(比如 100px×100px)的时候
System.IO.Stream oStream = FileUpload1.PostedFile.InputStream.ReadByte;
System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);
CreatePicture(oImage, 100, 100, tFullName); //第一次调用 不出错
CreatePicture(oImage, 700, 700, tFullName); //第二次调用 出错
System.ArgumentException: 参数无效。
int oWidth = Img.Width;
请问,这是什么原因,小弟没分了!!!
6 个解决方案
#1
问题补充 当图片很大 比如(500Px × 500px)的时候,不出错
#2
顶起,我也是这个问题...不清楚...
#3
很复杂啊@小生在此见识啦!顶!
#4
System.ArgumentException: 参数无效。
这个一般是什么问题引起的???
希望高手看看....
这个一般是什么问题引起的???
希望高手看看....
#5
使用asp.net做缩略图的时候一个很奇怪的现象,不知道是不是BUG
他存在一个问题,即使Dispose之后也IIS也会占用住线程不释放,你可以查看目录下的TEMP文件,直接删除试试,是删除不掉的
tImage.Save(SavePath, System.Drawing.Imaging.ImageFormat.Jpeg)这句存在问题,你在IDE里看看可能出现的Exception,有几种图片格式是不支持的
缩略图我一般使用ASPJPEG组件来做,缩略图效果好,性能也很好
建议试试
他存在一个问题,即使Dispose之后也IIS也会占用住线程不释放,你可以查看目录下的TEMP文件,直接删除试试,是删除不掉的
tImage.Save(SavePath, System.Drawing.Imaging.ImageFormat.Jpeg)这句存在问题,你在IDE里看看可能出现的Exception,有几种图片格式是不支持的
缩略图我一般使用ASPJPEG组件来做,缩略图效果好,性能也很好
建议试试
#6
tImage.Dispose();
的问题。我写的winform程序也是这样
加这句//bgbmp.Dispose();
就会出现 :
未处理 System.ArgumentException
Message="参数无效。"
Source="System.Drawing"
在 Application.Run(new FormMain());的位置上
的问题。我写的winform程序也是这样
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DrawString
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
Image bgbmp;
Image lbbmp;
string lbtitle;
Font lbfont;
SolidBrush lbbrush;
Rectangle lbRect;
private void btnAddBackImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "加载背景图片";
ofd.Filter = "(*.jpg)|*.jpg|(*.bmp)|*.bmp|(*.png)|*.png|(*.gif)|*.gif|All files (*.*)|*.*";//Image files
ofd.Multiselect =false ;
ofd.InitialDirectory = "E:\\F\\wallpaper\\";// AppDomain.CurrentDomain.DynamicDirectory;
if (ofd.ShowDialog() == DialogResult.OK)
{
this.txtbgPath.Text = ofd.FileName;
bgbmp = Image.FromFile(ofd.FileName,false);
pictureBox1.Image = null;
this.pictureBox1.Image = bgbmp;
}
}
private void btnPreDraw_Click(object sender, EventArgs e)
{
System.Drawing.Graphics g = Graphics.FromImage(bgbmp);
g.DrawString(txtTitle.Text, lbfont, lbbrush, new System.Drawing.Rectangle(0, 0, 300, 200));
pictureBox2.Image = null;
this.pictureBox2.Image = bgbmp;
}
private void btnSetFont_Click(object sender, EventArgs e)
{
FontDialog fd = new FontDialog();
fd.ShowColor = true;
if (fd.ShowDialog() == DialogResult.OK) {
lblSetFont.Text = fd.Font.Name + "," + fd.Font.Size .ToString() + "pt," + fd.Color.Name;
//lblSetFont.Font = fd.Font;
lbfont = fd.Font;
lbbrush = new SolidBrush(fd.Color);
}
}
private void btnSaveBMP_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "保存预览图片到...";
sfd.Filter = "(*.jpg)|*.jpg";
sfd.InitialDirectory = "E:\\";
sfd.AddExtension = true;
sfd.AutoUpgradeEnabled = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
pictureBox2.Image.Save(sfd.FileName,System.Drawing.Imaging.ImageFormat.Jpeg);
//bgbmp.Dispose();
}
}
}
}
//System.Drawing.Image bmp = System.Drawing.Bitmap.FromFile("E:\\F\\wallpaper\\0164.jpg");
// System.Drawing.Graphics g = Graphics.FromImage(bmp);
// g.DrawString(textBox1.Text, new Font("宋体", 12), new SolidBrush(Color.Red), new System.Drawing.Rectangle(0, 0, textBox1.Text .Length, textBox1.Height));
// bmp.Save("e:\\1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
// bmp.Dispose();
加这句//bgbmp.Dispose();
就会出现 :
未处理 System.ArgumentException
Message="参数无效。"
Source="System.Drawing"
在 Application.Run(new FormMain());的位置上
#1
问题补充 当图片很大 比如(500Px × 500px)的时候,不出错
#2
顶起,我也是这个问题...不清楚...
#3
很复杂啊@小生在此见识啦!顶!
#4
System.ArgumentException: 参数无效。
这个一般是什么问题引起的???
希望高手看看....
这个一般是什么问题引起的???
希望高手看看....
#5
使用asp.net做缩略图的时候一个很奇怪的现象,不知道是不是BUG
他存在一个问题,即使Dispose之后也IIS也会占用住线程不释放,你可以查看目录下的TEMP文件,直接删除试试,是删除不掉的
tImage.Save(SavePath, System.Drawing.Imaging.ImageFormat.Jpeg)这句存在问题,你在IDE里看看可能出现的Exception,有几种图片格式是不支持的
缩略图我一般使用ASPJPEG组件来做,缩略图效果好,性能也很好
建议试试
他存在一个问题,即使Dispose之后也IIS也会占用住线程不释放,你可以查看目录下的TEMP文件,直接删除试试,是删除不掉的
tImage.Save(SavePath, System.Drawing.Imaging.ImageFormat.Jpeg)这句存在问题,你在IDE里看看可能出现的Exception,有几种图片格式是不支持的
缩略图我一般使用ASPJPEG组件来做,缩略图效果好,性能也很好
建议试试
#6
tImage.Dispose();
的问题。我写的winform程序也是这样
加这句//bgbmp.Dispose();
就会出现 :
未处理 System.ArgumentException
Message="参数无效。"
Source="System.Drawing"
在 Application.Run(new FormMain());的位置上
的问题。我写的winform程序也是这样
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DrawString
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
Image bgbmp;
Image lbbmp;
string lbtitle;
Font lbfont;
SolidBrush lbbrush;
Rectangle lbRect;
private void btnAddBackImage_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "加载背景图片";
ofd.Filter = "(*.jpg)|*.jpg|(*.bmp)|*.bmp|(*.png)|*.png|(*.gif)|*.gif|All files (*.*)|*.*";//Image files
ofd.Multiselect =false ;
ofd.InitialDirectory = "E:\\F\\wallpaper\\";// AppDomain.CurrentDomain.DynamicDirectory;
if (ofd.ShowDialog() == DialogResult.OK)
{
this.txtbgPath.Text = ofd.FileName;
bgbmp = Image.FromFile(ofd.FileName,false);
pictureBox1.Image = null;
this.pictureBox1.Image = bgbmp;
}
}
private void btnPreDraw_Click(object sender, EventArgs e)
{
System.Drawing.Graphics g = Graphics.FromImage(bgbmp);
g.DrawString(txtTitle.Text, lbfont, lbbrush, new System.Drawing.Rectangle(0, 0, 300, 200));
pictureBox2.Image = null;
this.pictureBox2.Image = bgbmp;
}
private void btnSetFont_Click(object sender, EventArgs e)
{
FontDialog fd = new FontDialog();
fd.ShowColor = true;
if (fd.ShowDialog() == DialogResult.OK) {
lblSetFont.Text = fd.Font.Name + "," + fd.Font.Size .ToString() + "pt," + fd.Color.Name;
//lblSetFont.Font = fd.Font;
lbfont = fd.Font;
lbbrush = new SolidBrush(fd.Color);
}
}
private void btnSaveBMP_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "保存预览图片到...";
sfd.Filter = "(*.jpg)|*.jpg";
sfd.InitialDirectory = "E:\\";
sfd.AddExtension = true;
sfd.AutoUpgradeEnabled = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
pictureBox2.Image.Save(sfd.FileName,System.Drawing.Imaging.ImageFormat.Jpeg);
//bgbmp.Dispose();
}
}
}
}
//System.Drawing.Image bmp = System.Drawing.Bitmap.FromFile("E:\\F\\wallpaper\\0164.jpg");
// System.Drawing.Graphics g = Graphics.FromImage(bmp);
// g.DrawString(textBox1.Text, new Font("宋体", 12), new SolidBrush(Color.Red), new System.Drawing.Rectangle(0, 0, textBox1.Text .Length, textBox1.Height));
// bmp.Save("e:\\1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
// bmp.Dispose();
加这句//bgbmp.Dispose();
就会出现 :
未处理 System.ArgumentException
Message="参数无效。"
Source="System.Drawing"
在 Application.Run(new FormMain());的位置上