PDA

View Full Version : حرفه ای: نحوه فشرده سازی عکس و ذخیره عکس در دیتا بیس



mahyar-m
شنبه 08 اسفند 1388, 15:24 عصر
سلام دوستان عزیز
یک سری کنتر picturebox دارم که یه سری عکس رو با استفاده از کلیدی که در زیر هر کدوم از این کنترلها قرار داده شده تو این کنترلهای picture لود میکنم .
اما مشکلم اینه که نمیخوام عکس مورد نظرم با سایز اصلی در دیتا بیس ذخیره بشه چون عکسهام تقریبا سایزشون بالای 3 مگ هست تا 10 مگ . میخوام عکسهام فشرده بشند و بعد در دیتابیسم ذخیره بشن . ضمنا نمیخوام عکسهام فشرده شده هیچ جای هاردم ذخیره بشه . من عکسمو بایت به بایت میخونم و با توجه به مسیری که روی هارد دارن همون عکس رو ذخیره میکنم و با توجه به اینکه ممکنه در روز بالای 100 عکس در دیتابیس ذخیره بشه لذا حجم دیتابیسم اینطوری خیلی بالا میره .
ممنون میشم اگر کسی اطلاعاتی داره بهم بده .
موفق باشید

mohammad diba
شنبه 08 اسفند 1388, 17:10 عصر
سلام
اگه کیفیفت عکس مهم نیست میتونی رزلوشنش رو کم کنی که قطعا حجم اون کم می شه بعد ذخیره کنی.

In_Chan_Nafar
شنبه 08 اسفند 1388, 21:29 عصر
ذخيره Blob بالاتر از 1 مگابايت در داخل DataFile به صورت شديد Fragmentation را در بانك اطلاعاتي افزايش مي دهد يكم در مورد برنامه و.... توضيح دهيد تا بيشتر راهنماييتان كنم
نسخه بانك اطلاعاتي آيا SQL 2008
نوع برنامه شما آيا سرور و APP هر دو در يك سيستم هستند و End User دسترسي كامل به DB سرور داردو ...

mahyar-m
شنبه 08 اسفند 1388, 22:55 عصر
ممنونم از پاسخگوییتون
در مورد اینکه عکس فشرده بشه یا رزولوشنش کم شه بعد ذخیره شه چنین امکانی وجود نداره . یعنی یه حجم خیلی بزرگ اطلاعات و تعداد خیلی زیاد عکسه که از حوصله و حتی وقت کاربر خارجه .
اما در مورد برنامه..
برنامه من دو نسخه داره یکی تحت شبکه و یکی هم به صورت لوکال .
من با این تابع عکس رو تبدیل به بایت میکنم



public byte[] ReadFile(string sPath)
{
byte[] data = null;
FileInfo fInfo = new FileInfo(sPath);
long numBytes = fInfo.Length;
FileStream fStream = new FileStream(sPath, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fStream);
data = br.ReadBytes((int)numBytes);
return data;
}

و اینطوری از تابع استفاده میکنم


byte[] imageData = ReadFile(strf);


اما مشکلم اینه که اون strf مسیر عکس اصلیه . خواستم که مثلا با روشی عکس رو در اندازه همون کنترل picture ذخیره کنم اما نتونستم چنین کاریو بکنم . یعنی نمیدونستم که از چه روشی یا تابعی واسه فشرده سازی عکسم استفاده کنم . حالا اگر بشه عکس بدون ذخیره سازی در یک فولدر temp به صورت مستقیم با حجم کم (مثلا یه عکس 10 مگی با اندازه 100 کیلویی ذخیره بشه یا کمتر ) که خیلی عالیه و گرنه که یه جای ذخیره شه بعد عکس فشرده شده که در دیتابیس قرار گرفت فولدر تمپ هم پاک شه . من فقط به بخش فشرده سازی نیاز دارم . و البته خوب اگر بشه که به صورت بایت هم ذخیره بشه که بعدا بشه در قسمتی مثلا جستجو پیش نمایش عکس ذخیره شده نمایش داده بشه خیلی عالیه . من یه سری از توابع و متدهای کنترل picture بو نگاه کردم اما اکثرا به صورت read only بودن جزء این متد که سر پارامتر 3 و 4 موندم ( البته 3 بیشتر چون تونستم واسه 4 کاری بکنم ) . اگر کسی میتونه لطفا منو راهنمایی کنه .



img.Image.GetThumbnailImage(100,200,....,....);

پارامتر اول و دوم به ترتیب طول و عرضند . اما در مورد پارامتر 3 نوشته که باید از نوع image.getthumbnailimageabort باشه و پارامتر 4 , باید از نوع intptr باشه .
اگر کسی میتونه لطفا راهنمایی کنه منو
ضمنا دیتا بیسم اس کیو ال 2000 و از ویژوال استودیو 2005 استفاده می کنم .
با تشکر

mahyar-m
شنبه 08 اسفند 1388, 23:22 عصر
فقط یه چیز دیگه اینکه متد save از کنترل picture.image یه سری پارمترها داره که فکر کنم بدرد اینکار بخوره ولی نمیدونم نحوه استفاده از پارامترهاش چه جوریه . فقط یه مدلشو بلدم که با دادن یک آدرس عکس رو در اون محل ذخیره میکنه .
بازم ممنونم

mahyar-m
یک شنبه 09 اسفند 1388, 19:39 عصر
کسی نمیتونه هیچ راهکاری بهم معرفی کنه و منو راهنمایی کنه .
ممنونم میشم اگه کمکم کنید

FastCode
یک شنبه 09 اسفند 1388, 21:22 عصر
یابد یه []int درست کنید و pixelهای تصویر رو یکی یکی توش کپی کنید و بعد به sql انتقال بدید.
میتونید از الگوریتم های فشرده سازی stream استفاده کنید که توی این سایت مستونید نمونه هاش رو پیدا کنید.

البته الگوریتمهایی مثل huffman وجود دارند که برای فشرده سازی باید تمام اطلاعات همزمان در اختیارشون باشه.
ولی خاصیتشون اینه که معمولا" قویتر اند.
و نکته ی دیگه اینکه یه راه دیگه هم هست:
برای هر کلاینت یه پوشه با دسترسی همون کلاینت(برای امنیت) توی سرور داشته باشید.
کلاینت تصویر رو توی پوشه upload کنه و به console سرور اطلاع بده که فایل رو انتقال بده و آدرس جدیدش رو (توی پوشه ای که تمام کلاینت ها دسترسی Readonly به اون دارن) توی دیتابیس ثبت کنه.

mahyar-m
دوشنبه 10 اسفند 1388, 12:57 عصر
یابد یه []int درست کنید و pixelهای تصویر رو یکی یکی توش کپی کنید و بعد به sql انتقال بدید.


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

mahyar-m
سه شنبه 11 اسفند 1388, 23:02 عصر
آقا کسی نیست یه راهنمایی کوچیک به من بده ؟؟

FastCode
چهارشنبه 12 اسفند 1388, 00:09 صبح
باتشکر از شما دوست عزیز
می تونید دقیقتر راهنماییم کنید اگه تیکه کد هم بدید که بهتر وگرنه اگه لطف کنید راهنماییم کنید متشکر میشم
بازم ممنون

منظورم اینه که اگر dpi براتون اهمیتی نداره, میتونید با توابع system.graphics پیکسل های اون رو توی یه array بریزید(int بزای 32 بیت بودن تصویر) بعد عکس جدید که حجمش نصف شده رو توی sql ثبت کنید.(ضرر:کاهش کیفیت خاصیت:کاهش حجم و عدم بهم ریختگی تصویر)

mahyar-m
چهارشنبه 12 اسفند 1388, 00:33 صبح
آقا مشکل من حل شد . اینجا به جواب رسیدم . لینک گذاشتم تا اگه بعدا کسی به چنین چیزی نیاز داشت بهش خیلی راحت برسه .

http://bytes.com/topic/visual-basic-net/answers/368315-best-way-print-high-resolution-images

mortezaCsharp
سه شنبه 06 آبان 1393, 08:03 صبح
ممنون از راهنماییت!