PDA

View Full Version : بهترین راه ذخیره عکس در DataBase



مهدی رحیم زاده
جمعه 25 اردیبهشت 1388, 16:02 عصر
سلام خدمت تمام دوستام عزیز
من با استفاده از اسکنر یک عکس رو اسکن می کنم و بعد با استفاده از این کد اونو توی دیتا بیس ذخیره می کنم:

MemoryStream MS = new MemoryStream();
pictureBox1.Image.Save(MS, pictureBox1.Image.RawFormat);
PicByte = MS.GetBuffer();
MS.Close();
cmd.Parameters.Clear();
cmd.CommandText = "INSERT INTO S_Attached_File(ArNum, AtchFile, FileTitle,ArYear)" +
" VALUES(" + Convert.ToInt32(ArNumtextBox.Text) + ", @AtchFile_,'"+
AttachtextBox.Text + "'," + ActiveYearClass.ActiveYear + ")";
cmd.Parameters.Add(new SqlParameter("@AtchFile_", SqlDbType.Binary)).Value = PicByte;
dbc.ide(cmd);
مشکلی که داره اینه که حجم عکس خیلی بالا میره و روند ذخیره سازی طولانی میشه! یکی پیشنهاد می کرد که از BMP استفاده نکنم و از Jpg استفاده کنم. اگه این راه درسته چطور باید این کار رو انجام بدم و اگه نه راه درستش چیه ؟
با تشکر

behzadk
جمعه 25 اردیبهشت 1388, 17:53 عصر
اگه خیلی زیاد می شه و تعداد رکورد ها هم بالا میره شما اصلا عکس رو ذخیره نکنین اول اونو تو یه پوشه ذخیره کنین بعد آدرس اونو تو دیتابیس ذخیره کنین شما تصور کنین که 10000تا رکورد باشه با عکس اسکن شده بالای 1 mb یعنی باید به طور متوسط 5000 تا عکس رو در هنگام select بخونه

مهدی رحیم زاده
جمعه 25 اردیبهشت 1388, 23:34 عصر
اما بهتره که این عکس ها توی دیتابیس ذخیره بشن !
راهی نداره که همونجا ذخیره بشن ولی قبل از ذخیره سازی اونو فشرده کرد ؟

adinochestva
جمعه 25 اردیبهشت 1388, 23:40 عصر
از این کد برای تبدیل به jpg استفاده کن



var qualityEncoder = Encoder.Quality;
var quality = (long)<desired quality>;
var ratio = new EncoderParameter(qualityEncoder, quality );
var codecParams = new EncoderParameters(1);
codecParams.Param[0] = ratio;
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">;
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG



به جای
<desired quality> هم کیفیت مورد نظرت رو بزار. هرچه کمتر هجم کمتر

esmaeily-hosein
شنبه 26 اردیبهشت 1388, 10:13 صبح
نوعت تو بانک از Image به varbinary تغییر بده تو microsft خوندم برای اندازه های بزرگ بهتره دلیلش خودم نمیدونم.
اگه کیفیت برات مهم نیست به gif تبدیل کن و معمولا عکسو به صورت thumbnail ذخیره میکنند .
راهکار دوم استفاده از مبحثی به نام Data Lossy که تو برنامه های تحت ویندوز استفاده میشه یعنی میان عکسارو تو db ذخیره میکنند بعد یه database local هم ذخیره میکنند و تو این جدول local فقط یک Id با یه عکس میباشد عکس های که تو بانک Server هست و تو بانک local نیست از Server میاد و یه نسخه در بانک local ذخیره میشه و برای دفعه بعد دیگه از server نمیاد مستقیم از بانک local اطلاعات fetch میشه با این روش تو میتونی ستون های دیگه رو به کاربر نشون بدی و بعد یواش یواش عکس ها رو بهش نشون بدی.

مهدی رحیم زاده
یک شنبه 27 اردیبهشت 1388, 00:37 صبح
میشه نحوه استفاده کدی که نوشتی رو بگی!
من اینو کجا و چطور باید استفاده کنم ؟
ممنون

مهدی رحیم زاده
یک شنبه 27 اردیبهشت 1388, 21:33 عصر
کسی نمیدنه چطور باید از این کد استفاده کنیم ؟
خیلی لازمش دارم

مهدی رحیم زاده
جمعه 15 خرداد 1388, 11:00 صبح
اینجا یه روش ساده اما کارآمد رو آموزش داده
امیدوارم بدرد بخوره
http://www.c-sharpcorner.com/UploadFile/scottlysle/ImageConverter09132006105604AM/ImageConverter.aspx?ArticleID=53c063a5-837e-4ca2-86c4-57832ac98163

Sajjad.Aghapour
جمعه 15 خرداد 1388, 19:13 عصر
راهکار دوم استفاده از مبحثی به نام Data Lossy که تو برنامه های تحت ویندوز استفاده میشه یعنی میان عکسارو تو db ذخیره میکنند بعد یه database local هم ذخیره میکنند و تو این جدول local فقط یک Id با یه عکس میباشد عکس های که تو بانک Server هست و تو بانک local نیست از Server میاد و یه نسخه در بانک local ذخیره میشه و برای دفعه بعد دیگه از server نمیاد مستقیم از بانک local اطلاعات fetch میشه با این روش تو میتونی ستون های دیگه رو به کاربر نشون بدی و بعد یواش یواش عکس ها رو بهش نشون بدی.

منظورتون همون cache هست؟؟؟

esmaeily-hosein
یک شنبه 17 خرداد 1388, 14:36 عصر
منظورتون همون cache هست؟؟؟

میتوان به عنوان cache هم از آن نام برد . با استفاده از این راه ترافیک شبکه به حد بسیار زیادی کاهش میکند .
نکته : در Server ها معمولا ظرفیت Hard disk بسیار بالاست ولی سمت client محدودیتی بیشتر است .
معمولا در این گونه مواقع معمولا عکس هایی در db سمت client ذخیره میشوند که جز 500 رکورد آخر هستند .