PDA

View Full Version : استفاده از Thumbnail برای تصاویر در گریدویو



fereshte22
شنبه 30 تیر 1386, 11:18 صبح
سلام
من یک سری تصویر دارم که اونها در یک فولدر ذخیره کردهام و نام اون تصاویر را در دیتابیس ذخیره کردهام و برای بازیابی اونها در گرید ویو به صورت زیر عمل میکنم(که نام تصاویر با فیلد namepicture مشخص میشود ودر پوشه images ذخیره شده)


<asp:GridViewID="GridView2"runat="server"AutoGenerateColumns="False"DataSourceID="SqlDataSource1">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<tdstyle="vertical-align: middle; width: 130px; height: 130px; text-align: center">
<imgsrc=".\Images\<%#Eval("namepicture")%>"></td>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>


من میخواهم وقتی تصاویر را اپلود میکنم پهنا و ارتفاع انها را نیز مشخص کنم و بر اساس این اندازه ها تصاویر را در گرید ویو نمایش دهم.

کد زیر اندازه تصاویر را تغییر میدهد.


protectedvoid Page_Load(object sender, System.EventArgs e)
{
// get the file name -- fall800.jpg
string file = Request.QueryString["file"];
// create an image object, using the filename we just retrieved
System.Drawing.Image image = System.Drawing.Image.FromFile(Server.MapPath(file) );
// create the actual thumbnail image
System.Drawing.Image thumbnailImage = image.GetThumbnailImage(100,400, new System.Drawing.Image.GetThumbnailImageAbort(Thumbn ailCallback), IntPtr.Zero);

// make a memory stream to work with the image bytes
MemoryStream imageStream = newMemoryStream();
// put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);
// make byte array the same size as the image
byte[] imageContent = newByte[imageStream.Length];
// rewind the memory stream
imageStream.Position = 0;
// load the byte array with the image
imageStream.Read(imageContent, 0, (int)imageStream.Length);
// return byte array to caller with image type
Response.ContentType = "image/jpeg";
Response.BinaryWrite(imageContent);
}

publicbool ThumbnailCallback()
{
returntrue;
}



ودر صفحه نمایش تصاویر:


<asp:Imageid="Image1"runat="server"ImageUrl="MakeThumbnail1.aspx?file=piic.jpg"/>


حالا سوال من اینه برای تصاویر در گرید ویو چگونه باید این کد تغییر سایز را استفاده کنم؟

Nightbat
شنبه 30 تیر 1386, 13:13 عصر
اگر وقت Upload اندازه تصاویر را به اندازه دلخواه تغییر دادی، دیگه وقت نشون دادنشون چه مشکلی هست ؟

fereshte22
شنبه 30 تیر 1386, 13:44 عصر
ببینید من وقتی یک فیلد تصویر تنها دارم از کد زیر استفاده میکنم


<asp:Imageid="Image1"runat="server"ImageUrl="MakeThumbnail1.aspx?file=piic.jpg"/>


حالا وقتی این image در گرید ویو قرار میگیرد نام فایل باید از دیتابیس خونده شود.
مثلا در مثال بالا piic.jpg است .
در گرید ویو به چه صورت باید این نام را مشخص کنیم؟
حدس میزنم باید از

.\Images\<%#Eval("namepicture")%>

به جای نام فایل استفاده کنم ولی مثل اینکه درست استفاده نمیکنم و خطا میگیرد.

Nightbat
شنبه 30 تیر 1386, 14:15 عصر
این یه راهشه:

<asp:Image ID="Image1" runat="server" ImageUrl='<%# "~/Images/" + Eval("namepicture") %>' />

fereshte22
شنبه 30 تیر 1386, 15:02 عصر
خوب حالا چه طوری ادرس صفحه MakeThumbnail1.aspx را هم به این کنترل نسبت دهیم تا اندازه تصویر تغییر کند.در واقع مشکل اصلیه من همینه.چون اگه پست هام را دوباره یه نگاه بندازید میبینید که من با نمایش تصویر بدون اینکه بخواهم اندازه اون را تغییر دهم مشکلی ندارم

Nightbat
شنبه 30 تیر 1386, 15:28 عصر
من یه چیزی را نمی فهمم. شما از طریق اون کدها، اندازه عکس را تغییر می دید. این کار هم کافیه یه دفعه انجام بشه. و اونوقت هم می تونه همون وقتی باشه که upload میشه. پس وقت نمایش فقط کافیه نشون داده بشه.یا من یه اشتباه متوجه شدم ؟؟

fereshte22
شنبه 30 تیر 1386, 16:45 عصر
خوب فکر کنم من کمی بد توضیح دادم.
ببینید من از کد زیر برای اپلود تصویر استفاده میکنم


Dim thistime As DateTime
thistime = DateTime.Now
Dim year, month, day, hourse, min, sec, filename, picext, name, strpath AsString
year = thistime.Year.ToString()
month = thistime.Month.ToString()
day = thistime.Day.ToString()
hourse = thistime.Hour.ToString()
min = thistime.Minute.ToString()
sec = thistime.Second.ToString()
filename = f_FileUpload_Folder.PostedFile.FileName
picext = System.IO.Path.GetExtension(filename)
name = year + month + day + hourse + min + sec + picext
strpath = Request.MapPath(Request.ApplicationPath)
strpath += "\\images\\" + name
f_FileUpload_Folder.PostedFile.SaveAs(strpath)

حالا مشکل من اینه برای تغییر اندازه تصویر باید چی کار کنم؟(در واقع من این کدها را فقط برای موقعی که تصویر در خارج از گریدویو است تست کردهام )
کدهای تغییر سایز عکس را به چه صورت استفاده کنم؟
چون وقتی در همین صفحه اپلود مینویسم خطا میگیرد..اگر دوستان لطف کنند و چگونگی استفاده از این کد را توضیح دهید ممنون میشوم.(اگر کدها را دقیقا بنویسید که دیگه خیلی خوب میشود.)
نمیدونم منظورم را واضح گفتم و یا نه؟
و یه چیز دیگه اینکه نمیدونم چراوقتی کدها را به vb تبدیل میکنم کنترل تصویر چیزی نمایش داده نمیشود(برای یک کنترل تصویر)
معادل vb



ProtectedSub Page_Load(ByVal sender AsObject, ByVal e As System.EventArgs)
' get the file name -- fall800.jpg
Dim file AsString = Request.QueryString("file")
' create an image object, using the filename we just retrieved
Dim image As System.Drawing.Image = System.Drawing.Image.FromFile(Server.MapPath(file) )
' create the actual thumbnail image
Dim thumbnailImage As System.Drawing.Image = image.GetThumbnailImage(100, 64, New System.Drawing.Image.GetThumbnailImageAbort(Addres sOf ThumbnailCallback), IntPtr.Zero)
' make a memory stream to work with the image bytes
Dim imageStream As MemoryStream = New MemoryStream()
' put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg)
' make byte array the same size as the image
Dim imageContent() AsByte = NewByte(imageStream.Length) {}
' rewind the memory stream
imageStream.Position = 0
' load the byte array with the image
imageStream.Read(imageContent, 0, CType(imageStream.Length, Integer))
' return byte array to caller with image type
Response.ContentType = "image/jpeg"
Response.BinaryWrite(imageContent)
EndSub

PublicFunction ThumbnailCallback() AsBoolean
ReturnTrue
EndFunction

Nightbat
شنبه 30 تیر 1386, 17:18 عصر
اگه کد تغییر عکس را بعد از upload بنویسید و مقدار string file = strpath درست می شه ( من vb بلد نیستم وگرنه کدش رو می نوشتم! )

nazaninam
شنبه 30 تیر 1386, 19:10 عصر
پیشنهاد می کنم از یک HttpHandler برای اینکار استفاده کنید

fereshte22
شنبه 30 تیر 1386, 21:12 عصر
سلام
دوست عزیز snmnightbat من طبق راهنمای های شما به صورت زیر عمل کردم



filename = f_FileUpload_Folder.PostedFile.FileName
picext = System.IO.Path.GetExtension(filename)
name = year + month + day + hourse + min + sec + picext
strpath = Request.MapPath(Request.ApplicationPath)
strpath += "\\images\\" + name
f_FileUpload_Folder.PostedFile.SaveAs(strpath)
'''''''''''''''''''''''''''''''''
Dim file AsString = strpath
Dim image As System.Drawing.Image = System.Drawing.Image.FromFile(strpath)
Dim thumbnailImage As System.Drawing.Image = image.GetThumbnailImage(64, 64, New System.Drawing.Image.GetThumbnailImageAbort(Addres sOf ThumbnailCallback), IntPtr.Zero)
Dim imageStream As MemoryStream = New MemoryStream()
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim imageContent() AsByte = NewByte(imageStream.Length) {}
imageStream.Position = 0
imageStream.Read(imageContent, 0, CType(imageStream.Length, Integer))
Response.ContentType = "image/jpeg"
Response.BinaryWrite(imageContent)

خوب این کد درست کار میکند(چون تصویر را با اندازه تغییر یافته در همون صفحه اپلود نشان میدهد) ولی در گرید ویو تصاویر تغییر نمیکنند و با همان اندازه اولیه نشان داده میشوند.؟؟؟؟؟؟؟؟؟؟؟



پیشنهاد می کنم از یک HttpHandler برای اینکار استفاده کنید

دوست عزیز nazaninam میشه بیشتر توضیح دهید.

www2006
شنبه 30 تیر 1386, 21:28 عصر
من میخواهم وقتی تصاویر را اپلود میکنم پهنا و ارتفاع انها را نیز مشخص کنم و بر اساس این اندازه ها تصاویر را در گرید ویو نمایش دهم.

سوال من اینه برای تصاویر در گرید ویو چگونه باید این کد تغییر سایز را استفاده کنم؟
برای تغییر سایز عکس هنگام نمایش اون ، فکر نمیکنم کد خاصی لازم باشه ..
اینو امتحان کنید :

<asp:Image ID="Image1" runat="server" width="20" height="15" ImageUrl='<%# Eval("PictureName", "~/Images/{0}") %>' />

fereshte22
شنبه 30 تیر 1386, 22:00 عصر
دوست عزیز www2006 خوب کد شما اندازه همه تصاویر را به یک اندازه تغییر میدهد.در حالی که من میخواهم این تغییر اندازه دست خود ما باشد

Neo Persian
یک شنبه 31 تیر 1386, 00:29 صبح
یه راهی هست که من ازش خیلی استفاده کردم

شما میتونی کد مربوط به resize عکس رو داخل یه کلاس بنویسی که این کلاس یه متود resize داره که مسیر عکس و width , height عکس رو میگیره و اسم عکس تولید شده در یک فولدر مشخص رو بر میگردونه

داخل gridView کافیه برای imageUrl اینو بنویسی:


ImageUrl='<%# "~/Images/" + Thumbnail.Resize(Eval("PictureName").ToString(), 200, 100) %>

Thumbnail اسم کلاس
Resize اسم متود
پارامتر اول اسم عکسی که در DB ذخیره شده و پارامترهای بعدی هم طول و عرض

babi_wd
یک شنبه 31 تیر 1386, 01:57 صبح
http://www.codeproject.com/aspnet/ThumbViewerControl.asp

fereshte22
یک شنبه 31 تیر 1386, 11:20 صبح
شما میتونی کد مربوط به resize عکس رو داخل یه کلاس بنویسی که این کلاس یه متود resize داره که مسیر عکس و width , height عکس رو میگیره و اسم عکس تولید شده در یک فولدر مشخص رو بر میگردونه


شرمنده.
میشه با مثال توضیح دهید که دقیقا باید چه کاری انجام دهم.خیلی لطف میکنید.من یه کم گیج شده ام.


ImageUrl='<%# "~/Images/" + Thumbnail.Resize(Eval("PictureName").ToString(), 200, 100) %>

یعنی اندازه تصویر اینجا مشخص شده است و یا اینکه از دیتابیس و یا کلاس مورد نظر خونده میشود
اگر راه حا مورد نظرتون را با مثال توضیح دهید خیلی خوب میشود.

fereshte22
دوشنبه 01 مرداد 1386, 00:51 صبح
دوست عزیز Neo Persian میتونم ازتون در خواست کنم که روش کارتون را با یک مثال توضیح دهید.من در یک جاهایی از کار مشکل دارم و به همین دلیل درست جواب نمیدهد.

fereshte22
یک شنبه 07 مرداد 1386, 11:48 صبح
دوست عزیز babi_wd در مورد این کنترلری که قرار داده بودید.من میخواستم تعداد کلیک بر روی تصویر را نیز مشخص کنم که البته اگر از گرید ویو استفاده کنم میتونم این کار را انجام دهم .حالا با این روش که شما معرفی کردی چطور میشه این کار را انجام داد.؟اگر بقیه دوستان هم من را در حل این مشکل راهنمایی کنند ممنون میشوم.

ClaimAlireza
چهارشنبه 21 شهریور 1386, 10:48 صبح
protectedvoid Page_Load(object sender, System.EventArgs e)
{
// get the file name -- fall800.jpg
string file = Request.QueryString["file"];
// create an image object, using the filename we just retrieved
System.Drawing.Image image = System.Drawing.Image.FromFile(Server.MapPath(file) );
// create the actual thumbnail image
System.Drawing.Image thumbnailImage = image.GetThumbnailImage(100,400, new System.Drawing.Image.GetThumbnailImageAbort(Thumbn ailCallback), IntPtr.Zero);

// make a memory stream to work with the image bytes
MemoryStream imageStream = newMemoryStream();
// put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);
// make byte array the same size as the image
byte[] imageContent = newByte[imageStream.Length];
// rewind the memory stream
imageStream.Position = 0;
// load the byte array with the image
imageStream.Read(imageContent, 0, (int)imageStream.Length);
// return byte array to caller with image type
Response.ContentType = "image/jpeg";
Response.BinaryWrite(imageContent);
}


دوستان من نیاز دارم که ابعاد عکس رو به صورت فیزیکی تغییر بدم و اونو save کنم.

مثلا ابعاد تمامی عکسها بعد از آپلودشون توسط کاربر بشه 100*70 .

تا اونجایی که من فهمیدم کد فوق عکس رو به یه اندازه ای نشون میده ولی اندازه عکس رو به طور دایمی تغییر نمیده.

کدی هستش که این کارو بتونه انجام بده.

nazaninam
چهارشنبه 21 شهریور 1386, 11:47 صبح
لطفا تاپیک زیر را به دقت مطالعه کنید ! مشکلتون بر طرف خواهد شد
http://barnamenevis.org/forum/showthread.php?t=76608&highlight=%D8%B9%DA%A9%D8%B3

sama01
پنج شنبه 22 شهریور 1386, 06:48 صبح
دوستان من نیاز دارم که ابعاد عکس رو به صورت فیزیکی تغییر بدم و اونو save کنم.
مثلا ابعاد تمامی عکسها بعد از آپلودشون توسط کاربر بشه 100*70 .
تا اونجایی که من فهمیدم کد فوق عکس رو به یه اندازه ای نشون میده ولی اندازه عکس رو به طور دایمی تغییر نمیده.
کدی هستش که این کارو بتونه انجام بده.
در این کد، تصویر، تغییر اندازه داده شده و به جای ذخیره در سرور برای استفاده‌های بعدی، در حافظه‌ی موقت ذخیره می‌شود.
برای ذخیره‌ی تصویر در سرور، باید در کد ذخیره سازی به جای imageStream که از نوع memoryStream هست، آدرس دخیره سازی را وارد کنید. مثلا


thumbnailImage.Save(server.mapPath("~/thumbs/pic1.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);

ClaimAlireza
پنج شنبه 22 شهریور 1386, 10:27 صبح
با عرض سلام ...



برای ذخیره‌ی تصویر در سرور، باید در کد ذخیره سازی به جای imageStream که از نوع memoryStream هست، آدرس دخیره سازی را وارد کنید. مثلا



ارور میده:



System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.


با تشکر...

ClaimAlireza
پنج شنبه 22 شهریور 1386, 11:36 صبح
در جایی خوندم که باید مجوز write فولدر رو set کنم. ولی فکر نکنم ربطی داشته باشه.

چون اگه اسم فایل رو عوض کنم مشکل حل میشه.

مشکل اینجاست که نمیشه فایل رو replace کنم....

راهی به نظرتون میرسه...