PDA

View Full Version : مشکل کد نمایش عکس



mohsen_metn
یک شنبه 26 خرداد 1387, 14:45 عصر
سلام
من یه کد برا ذخیره و نمایش عکس در sql server پیدا کردم
کد ذخیره کردن


byte[] image;
string fileName = @"c:\yourImage.jpg";
// Open File and Read Into Byte Array
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
BinaryReader reader = new BinaryReader(fs);
image = reader.ReadBytes((int)fs.Length);
fs.Close();
}
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=aa;Integrated Security=True");
SqlCommand command = new SqlCommand("INSERT INTO Table1 (type,image) VALUES (@Caption,@Photo)");
command.Parameters.Add("@Caption", SqlDbType.NVarChar).Value = TextBox1.Text;
command.Parameters.Add("@Photo", SqlDbType.Image).Value = image;
command.Connection = conn;
conn.Open();
command.ExecuteNonQuery();

البته اونو کمی تغییر دادم و به نتبجه رسیدم.(کد بالا تغییر یافته است.فیلد hmage از نوع image)
کد بازیابی و نمایش


SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=aa;Integrated Security=True");
// Create Example DbCommand
string selectSql = "SELECT image FROM Table1 WHERE id = 1";
SqlCommand com = new SqlCommand(selectSql,conn);

// Execute Command
byte[] storedImage = (byte[])com.ExecuteScalar();
// Convert byte[] to Image
Image newImage;
using (MemoryStream stream = new MemoryStream(storedImage))
{
newImage = Image.FromStream(stream);

}
// Display to make sure code works
pictureBox1.Image = newImage;

ولی کد نمایش کار نمی کنه .ارور داره.
اولا اصلا picturebox در asp.net نداریم
دوما از image.fromstream ایراد می گیره
لطفا کمک کنید

mohsen_metn
یک شنبه 26 خرداد 1387, 16:05 عصر
کد درست برای نمایش رو پیدا کردم


// Put user code to initialize the page here
MemoryStream stream = new MemoryStream();
SqlConnection connection = new SqlConnection(@"Data Source=.;Initial Catalog=aa;Integrated Security=True");
try
{
connection.Open();
SqlCommand command = new SqlCommand("select image from Table1", connection);
byte[] image = (byte[])command.ExecuteScalar();
stream.Write(image, 0, image.Length);
Bitmap bitmap = new Bitmap(stream);

Response.ContentType = "image/gif";
bitmap.Save(Response.OutputStream, ImageFormat.Gif);
}
finally
{
connection.Close();
stream.Close();
}


حالا مشکل اینجاست که چطور یمقدار خوانده شده از بانک رو به یه کنترل image مربوط کنم

mohsen_metn
یک شنبه 26 خرداد 1387, 17:09 عصر
حالا مشکل اینجاست که چطور یمقدار خوانده شده از بانک رو به یه کنترل image مربوط کنم
کسی بلد نیست؟

Himalaya
یک شنبه 26 خرداد 1387, 23:52 عصر
قبل از اینکه در مورد کاری که واسه مورد شما انجام دادم توضیح بدم ، باید بگم که ... من تا حالا با عکس توی دیتا بیس کار نکردم ... اونم از نوع تحت وبش ... پس اگه اشتباه میگم بزارید به حساب این موضوع ...
اگه قراره تو یک پروژه تحت وب ، برای یک asp:image خاصیت imageurl رو set کنیم ، حتما میدونید که باید آدرس اونو به صورت string بهش بدیم...(نمیشه مثل پروژه های ویندوزی بگیم
مثلاpicturebox1.image=newimage . چون تقریبا ( البته فکر کنم دقیقا) تو پروژه های تحت وب تمام تگ هایی که میتونن با عکس کار کنن ، از imageurl یا یه چیزی شبیه به این استفاده میکنن...پس عکس مورد نظر ما ، برای نمایش تو image باید یا تو فضای مربوط به
سایت خود ما باشه یا کلا رو اینترنت باشه (نه تو دیتابیس)...
حالا میشه یه کاری کرد ... اول از پنجره solution explorer فایل solution پروژه خودتون رو select کنید و از منوی فایل save as مربوط به اونو بزنید و اون فایلو کنار فایل default.aspx خودتون save کنید ...
اگه این کارو انجام ندید،نمیشه مسیردهی درستی به عکس داشته باشیم ...يا حداقلش من نمیتونم (چون در غیر این صورت از مسیر ایراد میگیره)
solution موجود رو ببندید و solution جدید رو باز کنید ... یه پوشه درست کنید ( داخل فولدر پروژه... این پوشه محل ذخیره عکسهای خونده شده از دیتابیسه) ... تو کدهایی که تو تاپیک 2 نوشتید به جای اینکه عکس رو
از دیتابیس بخونید و اونو با stream ذخیره کنید ، اونو تو پوشه ایجاد شده ذخیره کنید ... یعنی به جای


bitmap.Save(Response.OutputStream, ImageFormat.Gif);

از این استفاده کنید


bitmap.Save("save pic here/01.gif", ImageFormat.Gif);
Image1.ImageUrl = "save pic here/01.gif";

و هر بار تو لود صفحه عکس ایجاد شده رو پاک کنید (پاک کردن عکس رو بلافاصله بعد از set کردن imageurl
انجام دادم ...اندازه قاب مربوط به image درست به اندازه عکس میشد ولی نمیتونست عکسو لود کنه و نشون بده. پس عکسو ،تو لود صفحه پاک کردم و همه چیز درست شد)...تو پروژه تحت وبی که ایجاد کردم ،این کارهارو انجام دادم و جواب هم داد(اجرا با vs) ... ولی نمیدونم که روی اینترنت هم درست جواب بده یا نه
امیدوارم به دردتون بخوره...

mohsen_metn
دوشنبه 27 خرداد 1387, 11:06 صبح
دوست عزیز karaji333 (http://barnamenevis.org/forum/member.php?u=53563) هدف از ذخیره عکس در دیتا بیس پاین اوردن حجم کلی سایت است. اگر قرار باشد که ان را دوباره پس از بازیابی در پوشه دیگیری ذخیره کنیم که نقض غرض شده است
در هر صورت از کمکتان ممنون
از دوستان دیگه بخصوص مدیر تالار تقاضای کمک دارم

raravaice
دوشنبه 27 خرداد 1387, 11:17 صبح
شما باید یه صفحه مجزا در نظر بگیری برای نمایش عکس و نوع هدر این صفحه رو image/jpeg یا image/gif بسته به نیازت تعریف کنی حالا هر وقت آدرس این صفحه رو به تگ image بدی عکس نمایش داده میشه.

موفق باشید

mohsen_metn
دوشنبه 27 خرداد 1387, 12:00 عصر
شما باید یه صفحه مجزا در نظر بگیری برای نمایش عکس و نوع هدر این صفحه رو image/jpeg یا image/gif بسته به نیازت تعریف کنی حالا هر وقت آدرس این صفحه رو به تگ image بدی عکس نمایش داده میشه.

موفق باشید
سلام
دوست عزیز می توانید بیشتر توضیح بدین (کد)
در ضمن من این کار رو برای ایجاد یک گالری عکس می خواهم انجام دهم

raravaice
دوشنبه 27 خرداد 1387, 15:51 عصر
شرمنده وقت تایپ مجدد نداشتم !
ولی مشابه مسئله شما در لینک زیر دربارش بحث شده مطالعه کنید 100% کار راه انداز هست.

http://barnamenevis.org/forum/showthread.php?t=98859

موفق باشید

Himalaya
دوشنبه 27 خرداد 1387, 17:57 عصر
دوست عزیز karaji333 هدف از ذخیره عکس در دیتا بیس پاین اوردن حجم کلی سایت است. اگر قرار باشد که ان را دوباره پس از بازیابی در پوشه دیگیری ذخیره کنیم که نقض غرض شده است



و هر بار تو لود صفحه عکس ایجاد شده رو پاک کنید

من که گفتم باید پاک هم بشه ... و فکر هم نمیکنم سیو شدن و یا پاک شدن عکس ، زمان زیادی ببره ... چون کاریه که تو سرور داره انجام میشه .... و ما با کدهایی که نوشتیم (1 خط) داریم اون عملیات رو تو سرور انجام میدیم

mohsen_metn
سه شنبه 28 خرداد 1387, 10:05 صبح
شرمنده وقت تایپ مجدد نداشتم !
ولی مشابه مسئله شما در لینک زیر دربارش بحث شده مطالعه کنید 100% کار راه انداز هست.

http://barnamenevis.org/forum/showthread.php?t=98859

موفق باشید
دوست عزیز raravaice (http://barnamenevis.org/forum/member.php?u=37086) ممنون از مثال خوبتون. فقط من یه مشکل دارم. من کد زیر رو توی page_load صفحه ای که قرار نقش عکس رو بازی کنه قرار دادم


Response.ContentType = "image/bmp";
SqlConnection connection = new SqlConnection(@"Data Source=.;Initial Catalog=aa;Integrated Security=True");
SqlCommand command = new SqlCommand("select q from tb", connection);
SqlDataReader dr;
dr = command.ExecuteReader();
while (dr.Read())
{
Response.BinaryWrite(dr.GetSqlBytes(0));
}

ولی در مورد خط response.write........... این مشکل رو می گیره:

Error 2 Argument '1': cannot convert from 'System.Data.SqlTypes.SqlBytes' to 'byte[]

در ضمن فیلد عکس من از نوع hmage است

raravaice
سه شنبه 28 خرداد 1387, 10:48 صبح
1.چرا مقادیر ستون رو نمیای بریزی توی یه متغییر از نوع آرایه بایت بعد Binarywrite کنی؟
2.حجم اطلاعات به نسبت متن زیاد هست چرا از Dataset و حالت Disconect برای خواندن اطلاعات از بانک استفاده نمیکنی که sql conection زمان کمتری باز باشه و منابع کمتری استفاده بشه؟

3.اون حلقه کارو خراب میکنه!هدفت چی بوده؟ استفاده از حلقه در این مورد کار خطرناکیه.;)

4. بعد از Response.BinaryWrite یه Response.Flush کن تا وضعیت بهینه تر بشه.

5.مقداری که BinaryWrite میگیره از نوع []Byte هست اون 0 چی میخواد اونجا؟

موفق باشید

mohsen_metn
چهارشنبه 29 خرداد 1387, 09:23 صبح
1.چرا مقادیر ستون رو نمیای بریزی توی یه متغییر از نوع آرایه بایت بعد Binarywrite کنی؟
2.حجم اطلاعات به نسبت متن زیاد هست چرا از Dataset و حالت Disconect برای خواندن اطلاعات از بانک استفاده نمیکنی که sql conection زمان کمتری باز باشه و منابع کمتری استفاده بشه؟

3.اون حلقه کارو خراب میکنه!هدفت چی بوده؟ استفاده از حلقه در این مورد کار خطرناکیه.;)

4. بعد از Response.BinaryWrite یه Response.Flush کن تا وضعیت بهینه تر بشه.

5.مقداری که BinaryWrite میگیره از نوع []Byte هست اون 0 چی میخواد اونجا؟

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


Response.ContentType = "image/bmp";
string s = Request.QueryString["id"];
MemoryStream stream = new MemoryStream();
SqlConnection connection = new SqlConnection(@"Data Source=.;Initial Catalog=aa;Integrated Security=True");
try
{
connection.Open();
SqlCommand command = new SqlCommand("select q from tb where id='"+s+"'", connection);
byte[] image = (byte[])command.ExecuteScalar();
stream.Write(image, 0, image.Length);
Bitmap bitmap = new Bitmap(stream);
Response.ContentType = "image/gif";
bitmap.Save(Response.OutputStream, ImageFormat.Gif);
}
finally
{
connection.Close();
stream.Close();
}

mohsen_metn
چهارشنبه 29 خرداد 1387, 12:10 عصر
دوباره سلام
یه سوال تازه. چطوری میشه این عکس رو توی گریدویو نمایش داد

raravaice
چهارشنبه 29 خرداد 1387, 12:35 عصر
چطوری میشه این عکس رو توی گریدویو نمایش دادشوخی میکنی با من؟ ;)

مثل یه عکس معمولی!
این صفحه ای که شما ساختی در اصل مسیر یه عکس هست که به خاصیت Src از Image میدی.
حالا میتونی برای اشاره به تصاویر مختلف مثلا شماره ID رکورد ذخیره شده عکس رو از طریق کوری بفرستی که عکس مورد نظرت نمایش داده بشه.

موفق باشید

mohsen_metn
چهارشنبه 29 خرداد 1387, 12:51 عصر
شوخی میکنی با من؟ ;)

مثل یه عکس معمولی!
این صفحه ای که شما ساختی در اصل مسیر یه عکس هست که به خاصیت Src از Image میدی.
حالا میتونی برای اشاره به تصاویر مختلف مثلا شماره ID رکورد ذخیره شده عکس رو از طریق کوری بفرستی که عکس مورد نظرت نمایش داده بشه.

موفق باشید
به خدا می دونم ولی....
من یه ستون به گرید ویوم اضافه کردم و در داخل اون یک کنترل ایمیج قرار دادم و به خاصیت یو ار ال ان این کد را گذاشتم


Default2.aspx؟id=Eval("id", "{0}")

ولی کاری انجام نمیده

raravaice
چهارشنبه 29 خرداد 1387, 13:04 عصر
1.علامت سئوالت چرا اونوریه؟ ;)
2.یه بار هم بیا عدد رو به صورت ثابت بهش بده شاید مشکل از Eval باشه!


موفق باشی

mohsen_metn
چهارشنبه 29 خرداد 1387, 14:02 عصر
1.علامت سئوالت چرا اونوریه؟ ;)
2.یه بار هم بیا عدد رو به صورت ثابت بهش بده شاید مشکل از Eval باشه!


موفق باشی
اره درسته مشکل از Eval است حالا چکار کنم.
کد گرید ویو


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" CellPadding="4" ForeColor="#333333" GridLines="None">
<Columns>
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"
SortExpression="id" />
<asp:BoundField DataField="w" HeaderText="w" SortExpression="w" />
<asp:TemplateField HeaderImageUrl="~/1 (4).gif">
<ItemTemplate>
&nbsp;<asp:Image ID="Image1" runat="server" ImageUrl='~/Default2.aspx?id=<%# Eval("id") %>' Height="200px" Width="200px" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<EditRowStyle BackColor="#999999" />
<SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
</asp:GridView>

raravaice
چهارشنبه 29 خرداد 1387, 14:21 عصر
متاسفانه با سورسی که شما به من دادید کمکی از دستم بر نمیاد محسن جان. یه بررسی بکن ببین چرا Eval مقدار رو بر نمی گردونه.

موفق باشید

mohsen_metn
چهارشنبه 29 خرداد 1387, 14:36 عصر
من متوجه مشکل شدم


ImageUrl='~/Default2.aspx?id=<%# Eval("id") %>'

قبل از Eval نباید پیزی نوشت ولی خوب نمی دونم راه حل اش چیه

Chabok
چهارشنبه 29 خرداد 1387, 14:46 عصر
برای درک مسئله کد HTMLی که تولید می شود را بررسی کنید
اونجوری بهتر میتونید مشکلتون رو حل کنید .

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

مثلا:
htttp://localhost/default2.aspx?id=10

با تست این دو مرحله بهتر به مشکلتون پی خواهید برد.

mohsen_metn
چهارشنبه 29 خرداد 1387, 14:54 عصر
برای درک مسئله کد HTMLی که تولید می شود را بررسی کنید
اونجوری بهتر میتونید مشکلتون رو حل کنید .

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

مثلا:
htttp://localhost/default2.aspx?id=10

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


<asp:Image ID="Image1" runat="server" ImageUrl='~/Default2.aspx?id=<%# Eval("id")%>' Height="200px" Width="200px" />

مقدار id رو برابر "<%"بر می گردونه

twelve
چهارشنبه 29 خرداد 1387, 14:59 عصر
من متوجه مشکل شدم


ImageUrl='~/Default2.aspx?id=<%# Eval("id") %>'
قبل از Eval نباید پیزی نوشت ولی خوب نمی دونم راه حل اش چیه

اینجوری بنویس احتمالا کارت راه میفته



ImageUrl="<% "~/Default2.aspx?id=" %><%# Eval ("id") %>"

raravaice
چهارشنبه 29 خرداد 1387, 14:59 عصر
به جای


<asp:Image

از تگ img و خاصیت Src استفاده کن ببین درست میشه.

موفق باشید

mohsen_metn
چهارشنبه 29 خرداد 1387, 15:14 عصر
اینجوری بنویس احتمالا کارت راه میفته



ImageUrl="<% "~/Default2.aspx?id=" %><%# Eval ("id") %>"


اینو قبلا خودم امتحان کردم نمی شه

mohsen_metn
چهارشنبه 29 خرداد 1387, 15:30 عصر
به جای


<asp:Image

از تگ img و خاصیت Src استفاده کن ببین درست میشه.

موفق باشید
دوست عزیز واقعا ممنون درست شد
ولی واقعا کنترل ایمیج خود ASP.NET قابلیت این کار رو نداره؟!!!!!!!!!!!!
در کل خیلی خیلی ممنون
کلی حال دادی

raravaice
چهارشنبه 29 خرداد 1387, 16:39 عصر
ولی واقعا کنترل ایمیج خود ASP.NET قابلیت این کار رو نداره؟!!!!!!!!!!!!کد قبلی که شما نوشتی کاملا درسته و نباید مشکلی داشته باشه برای همین من گفتم قادر به حدس زدن نیستم.

اینم امتحان کن ببین چی میشه:


ImageUrl='<%#"/Default2.aspx?id=" + Eval ("id") %>'


موفق باشید