文件上传,并生成缩略图奇怪的错误

时间:2021-12-05 20:31:46
程序代码
        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组件来做,缩略图效果好,性能也很好

建议试试

#6


tImage.Dispose(); 
的问题。我写的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组件来做,缩略图效果好,性能也很好

建议试试

#6


tImage.Dispose(); 
的问题。我写的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());的位置上