PDA

View Full Version : مبتدی: تغییر اندازه ی عکس



oldboy
چهارشنبه 26 خرداد 1389, 10:43 صبح
سلام دوستان.
من یه تگ input file تو برنامم دارم که می خوام یه عکس آپلود کنم.
ولی قبلش می خوام اگه اندازه ی عکس از یه مقدار بزرگتر شد کوچیکش کنم. برای همین یه Bitmap تعریف میکنم. ولی Bitmap مسیر کامل فایل رو می خواد و input(file).Value فقط اسم فایل رو می ده. نمی دونم چی کار کنم.:ناراحت:

Vahid_moghaddam
چهارشنبه 26 خرداد 1389, 10:46 صبح
فرض کنیم مسیر کامل فایل رو هم داشتید، از سرور چطوری می تونید یه فایل رو سیستم کلاینت بخونید؟
باید اندازه فایل upload شده رو کاهش بدید. یا با استفاده از javascript قبل از ارسال فایل اندازه رو چک کنید. توی سایت جستجو کنید. مثال های کاملی وجود داره

Vahid_moghaddam
چهارشنبه 26 خرداد 1389, 10:55 صبح
با استفاده از تابع ResizeImage می تونید اندازه عکس رو کاهش بدید.
using System.Drawing.Drawing2D;
using System.Drawing;


System.Drawing.Image ResizeImage(System.Drawing.Image image, int newWidth, int newHeight)
{

var thumbnailBitmap = new Bitmap(newWidth, newHeight);
var thumbnailGraph = Graphics.FromImage(thumbnailBitmap);
thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality;
thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality;
thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
var imageRectangle = new Rectangle(0, 0, newWidth, newHeight);
thumbnailGraph.DrawImage(image, imageRectangle);
thumbnailGraph.Dispose();
return thumbnailBitmap;
}

روش استفاده:

System.Drawing.Image objImage, objThumbnail;
objImage = System.Drawing.Image.FromStream(fileUpload.PostedF ile.InputStream);
objThumbnail = ResizeImage(objImage, newWidth, newHeight);
objThumbnail.Save(imageName , System.Drawing.Imaging.ImageFormat.Jpeg);
objImage.Dispose();
objThumbnail.Dispose();


در کد بالا newWidth و newHeight اندازه عکس و imageName نام عکس (شامل مسیر ذخیره عکس در سرور) هست

http://weblogs.asp.net/gunnarpeipman/archive/2009/04/02/resizing-images-without-loss-of-quality.aspx

oldboy
چهارشنبه 26 خرداد 1389, 12:48 عصر
objThumbnail.Save(imageName , System.Drawing.Imaging.ImageFormat.Jpeg);

خیلی ممنون از راهنماییتون. من این کار رو انجام دادم. حالا که می خوام فایل رو save کنم (خط بالا). ارور زیر رو میده:
A generic error occurred in GDI+.

تو این سایت و سایت های دیگه دنبال جوابش گشتم ولی هیچ کدوم مشکل رو حل نکرد. ممنون میشم اگه کمکم کنید.

Vahid_moghaddam
چهارشنبه 26 خرداد 1389, 14:10 عصر
objThumbnail.Save(imageName , System.Drawing.Imaging.ImageFormat.Jpeg);

خیلی ممنون از راهنماییتون. من این کار رو انجام دادم. حالا که می خوام فایل رو save کنم (خط بالا). ارور زیر رو میده:
A generic error occurred in GDI+.

تو این سایت و سایت های دیگه دنبال جوابش گشتم ولی هیچ کدوم مشکل رو حل نکرد. ممنون میشم اگه کمکم کنید.

یکی از دلایل بوجود اومدن این خطا مساله permission هست.

Apparently from ASP.Net you will get this error when you are using a file
path as a string. If this does not solve your problem then look at security
issues. The ASPNET useraccount may not have permissions to write to disk.
به لینک زیر مراجعه کنید و اگه کمک نکرد، کدتون رو بذارید.

http://weblogs.asp.net/anasghanem/archive/2009/02/28/solving-quot-a-generic-error-occurred-in-gdi-quot-exception.aspx

oldboy
پنج شنبه 27 خرداد 1389, 09:35 صبح
System.Drawing.Image ResizeImage(System.Drawing.Image image, int newWidth, int newHeight)
{
var thumbnailBitmap = new Bitmap(newWidth, newHeight);
var thumbnailGraph = Graphics.FromImage(thumbnailBitmap);
thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality;
thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality;
thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
var imageRectangle = new Rectangle(0, 0, newWidth, newHeight);
thumbnailGraph.DrawImage(image, imageRectangle);
thumbnailGraph.Dispose();
return thumbnailBitmap;
}

protected void btnSend_Click(object sender, EventArgs e)
{
AdakDataDataContext bank = new AdakDataDataContext();

tNew news = new tNew();
news.Title = txtTitle.Text;
news.NewSource = txtSource.Text;
news.Summary = txtSummary.Text;
news.Text = txtText.Text;
bank.tNews.InsertOnSubmit(news);
bank.SubmitChanges();

try
{
System.Drawing.Image objImage, objThumbnail;
objImage = System.Drawing.Image.FromStream(inpFileUp.PostedFi le.InputStream);
var id = (from t in bank.tNews
select new { t.Id });

object[] ids = id.ToArray();
string temp = ids[ids.Length - 1].ToString();
string img =temp.Substring(7,temp.Length-9);
if (objImage.Width > 200)
{
objThumbnail = ResizeImage(objImage, 200, (int)(objImage.Height * (200.0 / objImage.Width)));
}
else
{
objThumbnail = objImage;
}
GC.Collect();
Bitmap bmp = new Bitmap(objThumbnail);
objImage.Dispose();
objThumbnail.Dispose();
string path = "../Images/NewsImages/" + img + ".jpeg";
bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (Exception ex)
{
txtSummary.Text = ex.Message;
}


نمی دونم منظورتون از permission چه permissionایه. ولی به اون فولدر full control برای همه ی کاربرا دادم.
در ضمن از ویندوز 7 استفاده می کنم.

Vahid_moghaddam
پنج شنبه 27 خرداد 1389, 11:23 صبح
همونطور که توی پست قبلی نوشتم یکی از دلایل آدرس دهی غلطه. به این شکل آدرس رو برای ذخیره عکس تصحیح کنید:


objThumbnail.Save(Server.MapPath(".") + "//Images/NewsImages/" + img + ".jpeg" , System.Drawing.Imaging.ImageFormat.Jpeg);



آدرس بالا یعنی عکس در newImages که در images قرار داره ذخیره بشه. و images هم در ریشه وب سایت هست.

oldboy
پنج شنبه 27 خرداد 1389, 11:47 صبح
خیلی ممنون. درست شد. البته مسیر باید اینطوری باشه.

Server.MapPath(".") + "\\Images\\NewsImages\\" + img + ".jpeg"

aminghaderi
جمعه 28 خرداد 1389, 15:42 عصر
با کمال تشکر از دوستان.
خالی از لطف نیست برای دوستان که بعدا می خوان از این کد استفاده کنند عرض کنم ، خیلی در آدرس دهی دقت کنید که این کلاس متاسفانه برای اکثر خطاهای به وجود آمده فقط یه پیام داره و اون هم اینه :
A generic error occurred in GDI+.
که واقعا خدا نیاره که مثل بنده 4 ساعت در به در پیدا کردن جواب اون باشید که بعد بفهمید این پیام خطا مربوط به چند تا خطا بوده ، نه یک خطا ؟!:کف:
این هم کد به نتیجه رسیده من (با توجه به توضیحات و راهنمایی Vahid_moghaddam (http://www.barnamenevis.org/forum/member.php?u=29992) و oldboy (http://www.barnamenevis.org/forum/member.php?u=94578) )
در سمت Design یک FileUpload و یک Button.
در سمت Code :


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//=============================
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;


public partial class Lightbox_css_upload_image : System.Web.UI.Page
{
System.Drawing.Image ResizeImage(System.Drawing.Image image, int newWidth, int newHeight)
{
var thumbnailBitmap = new Bitmap(newWidth, newHeight);
var thumbnailGraph = Graphics.FromImage(thumbnailBitmap);
thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality;
thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality;
thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
var imageRectangle = new Rectangle(0, 0, newWidth, newHeight);
thumbnailGraph.DrawImage(image, imageRectangle);
thumbnailGraph.Dispose();
return thumbnailBitmap;
}

protected void Button1_Click(object sender, EventArgs e)
{
System.Drawing.Image objImage, objThumbnail;
objImage = System.Drawing.Image.FromStream(FileUpload1.Posted File.InputStream);
if (objImage.Width > 200)
{
objThumbnail = ResizeImage(objImage, 200, (int)(objImage.Height * (200.0 / objImage.Width)));
}
else
{
objThumbnail = objImage;
}
GC.Collect();
Bitmap bmp = new Bitmap(objThumbnail);
String FilePath = "Image\\Gallery_1_Big\\" + FileUpload1.FileName;
objThumbnail.Save(Request.PhysicalApplicationPath + FilePath, System.Drawing.Imaging.ImageFormat.Jpeg);
objImage.Dispose();
objThumbnail.Dispose();
}
}