Javad_Darvish_Amiry
شنبه 07 اسفند 1389, 02:27 صبح
سلام خسته نباشید. نمیدونم مطلبی که آماده کردم چقدر مفید هست، اما چون چند بار دیدم که دوستان با این مسئله مشکل داشتن، این کد رو نوشتم و این جا میزارم. این کلاس، یه کنترل فایل-آپلود و یه عدد صحیح به عنوان عرض تصاویر تامب میگیره، عکس رو از کنترل خونده و توی شیئ Image قرار میده، و همزمان آرایه عکس رو هم آماده میکنه (برای ذخیره تصاویر در دیتابیس مفیده) از طرفی یه تصویر تمب متناسب با عرض وارد شده هم میشازه و تامب رو هم به دو شکل آرایه و Image در دسترس قرار میده. کار کردن باهاش خیلی ساده است. سعی کردم ساده و مختصر و مفید باشه. امیدوارم به درد بخوره.
namespace Kavand.Core.Utilities {
using System;
using System.Drawing.Imaging;
using System.IO;
/// <summary>
/// کلاسی برای کار با کنترل فایل-آپلود، هنگامی که یک تصویر آپلود می گردد؛
/// </summary>
public class Picture {
/// <summary>
/// ارتفاع تصویر آپلود شده؛ می توان این خاصیت را در بانک ذخیره و یا از آن برای تست ارتفاع مجاز آپلود در سایت استفاده کرد؛
/// </summary>
public Int32 Height { get { return this.FullImage.Size.Height; } }
/// <summary>
/// عرض تصویر آپلود شده؛ می توان این خاصیت را در بانک ذخیره و یا از آن برای تست عرض مجاز آپلود در سایت استفاده کرد؛
/// </summary>
public Int32 Width { get { return this.FullImage.Size.Width; } }
/// <summary>
/// حجم تصویر آپلود شده؛ می توان این خاصیت را در بانک ذخیره و یا از آن برای تست حجم مجاز آپلود در سایت استفاده کرد؛
/// </summary>
public Int64 Size { get; private set; }
/// <summary>
/// ارتفاع تصویر تامب ساخته شده از روی تصویر اصلی
/// </summary>
public Int32 ThumbHeight { get; private set; }
/// <summary>
/// عرض تصویر تامب ساخته شده از روی تصویر اصلی
/// </summary>
public Int32 ThumbWidth { get; private set; }
/// <summary>
/// حجم تصویر تامب ساخته شده از روی تصویر اصلی
/// </summary>
public Int64 ThumbSize { get; private set; }
/// <summary>
/// تصویر آپلود شده اصلی
/// </summary>
public System.Drawing.Image FullImage { get; private set; }
/// <summary>
/// تامب ساخته شده از روی تصویر اصلی
/// </summary>
public System.Drawing.Image ThumbImage { get; private set; }
/// <summary>
/// تصویر اصلی آپلود شده به صورت آرایه ای از بایت ها؛ این خاصیت زمانی مفید است که قصد ذخیره تصاویر در بانک را داریم؛
/// </summary>
public Byte[] ImageByte { get; private set; }
/// <summary>
/// تامب ساخته شده از روی تصویر اصلی به صورت آرایه ای از بایت ها؛ این خاصیت زمانی مفید است که قصد ذخیره تصاویر در بانک را داریم؛
/// </summary>
public Byte[] ThumbByte { get; private set; }
/// <summary>
/// فرمت فایل
/// </summary>
public System.Drawing.Imaging.ImageFormat Format { get; private set; }
/// <summary>
/// پسوند فایل آپلود شده
/// </summary>
public String Extension { get; private set; }
/// <summary>
/// یک نمونه از کلاس پیکچر را ساخته، تصویر تامب را محاسبه کرده و خصوصیات را مقداردهی می کند؛
/// </summary>
/// <param name="fileUpload">کنترل فایل-آپلود که فایل آپلود شده توسط آن باید توسط این کلاس پردازش شده و تصویر تامب از آن ساخته شود؛</param>
/// <param name="thumbWidth">عرض مورد نظر برای تصویر تامب که بایستی از روی تصویر اصلی آپلود شده ساخته شود؛</param>
public Picture(System.Web.UI.WebControls.FileUpload fileUpload, Int32 thumbWidth) {
// پسوند فایل آپلود شده را به دست می آورد؛
this.Extension = GetExtension(fileUpload.PostedFile.FileName);
this.FullImage = default(System.Drawing.Image);
// به استریم ورودی نیاز داریم تا از روی آن تصویر را ساخته و یا آن را در آرایه برای ذخیره در بانک بنویسیم
System.IO.Stream stream = fileUpload.PostedFile.InputStream;
try {
// استریم ورودی را در شیئ ایمیج میریزیم؛
// از آن جا که ممکن است کاربر نهایی، فایلی غیر از فایل تصویر آپلود کند، لذا عملیات را در بلاک ترای قرار می دهیم؛
this.FullImage = System.Drawing.Image.FromStream(stream);
} catch (Exception ex) {
// منطق مورد نظر برای کنترل خطا را بنویسید؛
}
this.Size=fileUpload.PostedFile.InputStream.Length ;
this.ImageByte = new Byte[this.Size];
stream.Position = 0;
// استریم ورودی را در آرایه می ریزیم
stream.Read(this.ImageByte, 0, Convert.ToInt32(stream.Length));
stream.Dispose();
this.ThumbWidth = thumbWidth;
// ارتفاع تصویر تامب را از روی ارتفاع و عرض تصویر فعلی با توجه به عرض تعریف شده برای تصویر تامب به دست می آوریم؛
// به این ترتیب تصاویر تامب با عرض یک سان خواهیم داشت که اولا در گالری تصاویر حالت زیباتری از تصاویر با عرض های متفاوت خواهند داشت
// و ثانیا ارتفاع تصاویر تامب متناسب با تصویر اولیه بوده و حالت زننده ای نخواهد داشت؛
this.ThumbHeight = GetThumbHeight(this.ThumbWidth,this.Width, this.Height);
// در صورتیکه ایجاد تصویر تامب نیاز به توقف داشته باشد، این کال-بک اجرا خواهد شد؛
System.Drawing.Image.GetThumbnailImageAbort cb = new System.Drawing.Image.GetThumbnailImageAbort(Thumbn ailCallback);
// تصویر تامب ایجاد می گردد؛
this.ThumbImage = FullImage.GetThumbnailImage(this.ThumbWidth, this.ThumbHeight, cb, System.IntPtr.Zero);
// به این استریم نیاز داریم تا تصویر تامب را در آن ذخیره و بدین وسیله بتوانیم آنرا در آرایه بریزیم
MemoryStream thumbStream = new MemoryStream();
this.Format = GetImageFormat(this.Extension);
// تصور تامب را در استریم میریزیم؛
this.ThumbImage.Save(thumbStream, this.Format);
this.ThumbSize = thumbStream.Length;
this.ThumbByte = new Byte[this.ThumbSize];
thumbStream.Position = 0;
// استریم تامب را در آرایه میریزیم
thumbStream.Read(this.ThumbByte, 0, Convert.ToInt32(thumbStream.Length));
thumbStream.Dispose();
}
/// <summary>
/// پسوند فایل را بر میگرداند
/// </summary>
/// <param name="strPath">رشته ای که حاوی نام فایل است</param>
static public String GetExtension(System.String strPath) {
return System.IO.Path.GetExtension(strPath);
}
/// <summary>
/// فایل فرمت متناسب با پسوند را بر می گرداند
/// </summary>
/// <param name="extension">پسوند مورد نظر</param>
static public ImageFormat GetImageFormat(String extension) {
switch (extension.ToLower()) {
case ".jpg":
case ".jpeg":
case ".jpe":
return ImageFormat.Jpeg;
case ".png":
return ImageFormat.Png;
case ".gif":
return ImageFormat.Gif;
case ".bmp":
return ImageFormat.Bmp;
default:
throw new NotSupportedException();
}
}
/// <summary>
/// از روی ارتفاع و عرض تصویر اصلی، و با توجه به عرض تعریف شده برای تصاویر تامب، ارتفاع تصویر تامب را به دست می آورد
/// </summary>
/// <param name="thumbWidth">عرض تعریف شده برای تصاویر تامب</param>
/// <param name="iWidth">عرض تصویر اصلی</param>
/// <param name="iHeight">ارتفاع تصویر اصلی</param>
static private Int32 GetThumbHeight(Int32 thumbWidth, Int32 iWidth, Int32 iHeight) {
double percent = (Double)iWidth / thumbWidth;
return (Int32)Math.Round((iHeight / percent));
}
/// <summary>
/// در صورتیکه ایجاد تصویر تامب نیاز به توقف داشته باشد، این کال-بک اجرا خواهد شد؛
/// در واقع اگر این متود ترو را بر گرداند عملیات پردازش تصویر برای ساخت تامب متوقف می شود؛
/// </summary>
static private Boolean ThumbnailCallback() {
return false;
}
}
}
موفق باشید.
namespace Kavand.Core.Utilities {
using System;
using System.Drawing.Imaging;
using System.IO;
/// <summary>
/// کلاسی برای کار با کنترل فایل-آپلود، هنگامی که یک تصویر آپلود می گردد؛
/// </summary>
public class Picture {
/// <summary>
/// ارتفاع تصویر آپلود شده؛ می توان این خاصیت را در بانک ذخیره و یا از آن برای تست ارتفاع مجاز آپلود در سایت استفاده کرد؛
/// </summary>
public Int32 Height { get { return this.FullImage.Size.Height; } }
/// <summary>
/// عرض تصویر آپلود شده؛ می توان این خاصیت را در بانک ذخیره و یا از آن برای تست عرض مجاز آپلود در سایت استفاده کرد؛
/// </summary>
public Int32 Width { get { return this.FullImage.Size.Width; } }
/// <summary>
/// حجم تصویر آپلود شده؛ می توان این خاصیت را در بانک ذخیره و یا از آن برای تست حجم مجاز آپلود در سایت استفاده کرد؛
/// </summary>
public Int64 Size { get; private set; }
/// <summary>
/// ارتفاع تصویر تامب ساخته شده از روی تصویر اصلی
/// </summary>
public Int32 ThumbHeight { get; private set; }
/// <summary>
/// عرض تصویر تامب ساخته شده از روی تصویر اصلی
/// </summary>
public Int32 ThumbWidth { get; private set; }
/// <summary>
/// حجم تصویر تامب ساخته شده از روی تصویر اصلی
/// </summary>
public Int64 ThumbSize { get; private set; }
/// <summary>
/// تصویر آپلود شده اصلی
/// </summary>
public System.Drawing.Image FullImage { get; private set; }
/// <summary>
/// تامب ساخته شده از روی تصویر اصلی
/// </summary>
public System.Drawing.Image ThumbImage { get; private set; }
/// <summary>
/// تصویر اصلی آپلود شده به صورت آرایه ای از بایت ها؛ این خاصیت زمانی مفید است که قصد ذخیره تصاویر در بانک را داریم؛
/// </summary>
public Byte[] ImageByte { get; private set; }
/// <summary>
/// تامب ساخته شده از روی تصویر اصلی به صورت آرایه ای از بایت ها؛ این خاصیت زمانی مفید است که قصد ذخیره تصاویر در بانک را داریم؛
/// </summary>
public Byte[] ThumbByte { get; private set; }
/// <summary>
/// فرمت فایل
/// </summary>
public System.Drawing.Imaging.ImageFormat Format { get; private set; }
/// <summary>
/// پسوند فایل آپلود شده
/// </summary>
public String Extension { get; private set; }
/// <summary>
/// یک نمونه از کلاس پیکچر را ساخته، تصویر تامب را محاسبه کرده و خصوصیات را مقداردهی می کند؛
/// </summary>
/// <param name="fileUpload">کنترل فایل-آپلود که فایل آپلود شده توسط آن باید توسط این کلاس پردازش شده و تصویر تامب از آن ساخته شود؛</param>
/// <param name="thumbWidth">عرض مورد نظر برای تصویر تامب که بایستی از روی تصویر اصلی آپلود شده ساخته شود؛</param>
public Picture(System.Web.UI.WebControls.FileUpload fileUpload, Int32 thumbWidth) {
// پسوند فایل آپلود شده را به دست می آورد؛
this.Extension = GetExtension(fileUpload.PostedFile.FileName);
this.FullImage = default(System.Drawing.Image);
// به استریم ورودی نیاز داریم تا از روی آن تصویر را ساخته و یا آن را در آرایه برای ذخیره در بانک بنویسیم
System.IO.Stream stream = fileUpload.PostedFile.InputStream;
try {
// استریم ورودی را در شیئ ایمیج میریزیم؛
// از آن جا که ممکن است کاربر نهایی، فایلی غیر از فایل تصویر آپلود کند، لذا عملیات را در بلاک ترای قرار می دهیم؛
this.FullImage = System.Drawing.Image.FromStream(stream);
} catch (Exception ex) {
// منطق مورد نظر برای کنترل خطا را بنویسید؛
}
this.Size=fileUpload.PostedFile.InputStream.Length ;
this.ImageByte = new Byte[this.Size];
stream.Position = 0;
// استریم ورودی را در آرایه می ریزیم
stream.Read(this.ImageByte, 0, Convert.ToInt32(stream.Length));
stream.Dispose();
this.ThumbWidth = thumbWidth;
// ارتفاع تصویر تامب را از روی ارتفاع و عرض تصویر فعلی با توجه به عرض تعریف شده برای تصویر تامب به دست می آوریم؛
// به این ترتیب تصاویر تامب با عرض یک سان خواهیم داشت که اولا در گالری تصاویر حالت زیباتری از تصاویر با عرض های متفاوت خواهند داشت
// و ثانیا ارتفاع تصاویر تامب متناسب با تصویر اولیه بوده و حالت زننده ای نخواهد داشت؛
this.ThumbHeight = GetThumbHeight(this.ThumbWidth,this.Width, this.Height);
// در صورتیکه ایجاد تصویر تامب نیاز به توقف داشته باشد، این کال-بک اجرا خواهد شد؛
System.Drawing.Image.GetThumbnailImageAbort cb = new System.Drawing.Image.GetThumbnailImageAbort(Thumbn ailCallback);
// تصویر تامب ایجاد می گردد؛
this.ThumbImage = FullImage.GetThumbnailImage(this.ThumbWidth, this.ThumbHeight, cb, System.IntPtr.Zero);
// به این استریم نیاز داریم تا تصویر تامب را در آن ذخیره و بدین وسیله بتوانیم آنرا در آرایه بریزیم
MemoryStream thumbStream = new MemoryStream();
this.Format = GetImageFormat(this.Extension);
// تصور تامب را در استریم میریزیم؛
this.ThumbImage.Save(thumbStream, this.Format);
this.ThumbSize = thumbStream.Length;
this.ThumbByte = new Byte[this.ThumbSize];
thumbStream.Position = 0;
// استریم تامب را در آرایه میریزیم
thumbStream.Read(this.ThumbByte, 0, Convert.ToInt32(thumbStream.Length));
thumbStream.Dispose();
}
/// <summary>
/// پسوند فایل را بر میگرداند
/// </summary>
/// <param name="strPath">رشته ای که حاوی نام فایل است</param>
static public String GetExtension(System.String strPath) {
return System.IO.Path.GetExtension(strPath);
}
/// <summary>
/// فایل فرمت متناسب با پسوند را بر می گرداند
/// </summary>
/// <param name="extension">پسوند مورد نظر</param>
static public ImageFormat GetImageFormat(String extension) {
switch (extension.ToLower()) {
case ".jpg":
case ".jpeg":
case ".jpe":
return ImageFormat.Jpeg;
case ".png":
return ImageFormat.Png;
case ".gif":
return ImageFormat.Gif;
case ".bmp":
return ImageFormat.Bmp;
default:
throw new NotSupportedException();
}
}
/// <summary>
/// از روی ارتفاع و عرض تصویر اصلی، و با توجه به عرض تعریف شده برای تصاویر تامب، ارتفاع تصویر تامب را به دست می آورد
/// </summary>
/// <param name="thumbWidth">عرض تعریف شده برای تصاویر تامب</param>
/// <param name="iWidth">عرض تصویر اصلی</param>
/// <param name="iHeight">ارتفاع تصویر اصلی</param>
static private Int32 GetThumbHeight(Int32 thumbWidth, Int32 iWidth, Int32 iHeight) {
double percent = (Double)iWidth / thumbWidth;
return (Int32)Math.Round((iHeight / percent));
}
/// <summary>
/// در صورتیکه ایجاد تصویر تامب نیاز به توقف داشته باشد، این کال-بک اجرا خواهد شد؛
/// در واقع اگر این متود ترو را بر گرداند عملیات پردازش تصویر برای ساخت تامب متوقف می شود؛
/// </summary>
static private Boolean ThumbnailCallback() {
return false;
}
}
}
موفق باشید.