Monday, December 6, 2010

چگونگی نمایش تصویر ذخیره شده در بانک اس کیو ال

سلام دوستان

ممکنه شما هم به این مشکل هنگام ساخت برنامه های مبتنی بر بانک اطلاعاتی بر خورده باشین که چگونه تصاویر رو ذخیره کنیم؟ و چگونه اونها رو بازخوانی کنیم؟ آیا ذخیره آدرس عکس کافیه یا راه حل بهتری وجود داره؟

جواب: برای کار با عکس در برنامه های بانک اطلاعاتی، بهترین راه اینه که خود عکس رو در بانک اطلاعاتی ذخیره کنید تا با مشکلاتی مثل «عدم دسترسی به دیسک سخت» یا «کمبود حافظه» و مشکلاتی از این قبیل روبرو نشین.

برای مثال، در یک برنامه «دفترچه تلفن»، درصورتی که بخواهید عکس مخاطب رو در بانک SQL ذخیره کنید، کافیه در Table مربوطه یک فیلد از نوع Image داشته باشید. و در فرم ورود اطلاعات، یک PictureBox قرار بدین و خاصیت Image اون رو به فیلدی که قبلاً در بانک تعریف کرده بودین مرتبط کنین.
حالا اگر با استفاده از کد یک عکس رو در PictureBox نمایش بدین، این عکس به صورت خودکار در بانک ذخیره میشه و موقع بازخوانی هم به طور خودکار در PictureBox به نمایش در میاد.

چند نکته تخصصی
- فرمت Image چه نوع داده ای رو در بانک ذخیره میکنه و این عکس چگونه در بانک اطلاعاتی ذخیره میشه؟
- PictureBox این نوع داده ای رو چگونه به عکس تبدیل می کنه؟

بگذارید به نحوه ذخیره سازی عکس در بانک اطلاعاتی کمی آشناتر بشیم.
اگر در SQL به مقدار ذخیره شده در فیلد تصویری دقت کنید، متوجه میشین که SQL تصویر رو به صورت آرایه ای از نوع Byte ذخیره کرده که درواقع همون محتوای فایل عکس هستش.

برای تبدیل این بایت ها به تصویر قابل نمایش در PictureBox و یا به عبارت بهتر تبدیل به یک شی Bitmap، بهترین و سریعترین راه حل اینه که اونها رو توسط یک MemoryStream خوانده و به Stream تبدیل کنیم. سپس توسط متد FromStream کلاس Bitmap، اونها رو به یک شی Bitmap تبدیل می کنیم:

MemoryStream memStream = new MemoryStream(pictureBytes);
Bitmap bit = new Bitmap(Bitmap.FromStream(memStream));



حالا میتونین با شی Bitmap ایجاد شده، تغییراتی رو که لازمه در عکس انجام بشه رو انجام بدین.
در پایان نیز، برای ذخیره دوباره عکس در Database باید عکس رو به یک MemoryStream تبدیل و توسط متد ToArray اون رو به آرایه ای از نوع Byte تبدیل کنیم:


MemoryStream memStream2 = new MemoryStream();
bit.Save(memStream2, ImageFormat.Bmp);
byte[] pictureBytes2 = memStream2.ToArray();


توجه داشته باشین که متد Save شی Bitmap، میتونه تصویر موجود در این شی رو در یک فایل ویا Stream ذخیره کنه و پارامتر دوم اون، نوع تصویر ذخیره شده رو مشخص می کنه.


موفق باشید و خدا نگهدار

No comments:

Post a Comment