PDA

View Full Version : مشکل در تبدیل عکس به آرایه



mrali.jalali
شنبه 15 آبان 1395, 20:00 عصر
سلام
من میخام حدود 100 تا 150 تا عکس را انتخاب کنم و داخل یک ارایه بایتی(لیست ) بریزم. حجم فولدرم که عکس ها داخلشه 25 مگه . وقتی عکس ها رو انتخاب میکنم حدود 90 تا 100 تاشو تبدیل میکنه بعد خطای out of memory میده . در task manager که میبینم رم رشد پیدا میکنه . ی چیزی نزدیک یک ونیم گیگ رم میشه . کسی میدونه باید چکار کنم ؟؟؟
دستورات و برنامه رو هم میگذارم


public static byte[] converterDemo(Image x)
{
ImageConverter _imageConverter = new ImageConverter();
byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
return xByte;
}

private void button1_Click(object sender, EventArgs e)
{
List<byte[]>t=new List<byte[]>();
int k=0;
openFileDialog1.ShowDialog();
try
{
foreach (string s in openFileDialog1.FileNames)
{
Image i = Image.FromFile(s);
t.Add(converterDemo(i));
k++;
}
MessageBox.Show("ثبت انجام شد " + k.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString() + "\n" + " " + k.ToString());
}



}











http://s8.picofile.com/file/8273556176/WindowsFormsApplication1.rar.html

mrprestige
شنبه 15 آبان 1395, 21:51 عصر
سلام دوست من وقتت بخیر ، خب پس این مسئله نشون میده روشی که پیش گرفتید اصولی نیست من بهتون پیشنهاد میدم شما که میخواید عملیات روی عکس رو توی این حجم کلان انجام بدید بهتره که آدرس عکس های اسکن شده توی هارد دیسکتون رو داخل بانک اطلاعتیتون ذخیره کنید تا این که بخواید عکس ها رو بصورت Binary در بانک ذخیره و درنهایت عملیات مورد نظر رو روی اونها انجام بدید . منظورم اینه که شما با آدرس عکس ها سروکار دارید نه با خوده عکس ها . اینطوری حتی سرعت چاپ و بازیابی عکس هاتون رو هم به مراتب بیشتر هست .

mrali.jalali
شنبه 15 آبان 1395, 22:12 عصر
سلام دوست من وقتت بخیر ، خب پس این مسئله نشون میده روشی که پیش گرفتید اصولی نیست من بهتون پیشنهاد میدم شما که میخواید عملیات روی عکس رو توی این حجم کلان انجام بدید بهتره که آدرس عکس های اسکن شده توی هارد دیسکتون رو داخل بانک اطلاعتیتون ذخیره کنید تا این که بخواید عکس ها رو بصورت Binary در بانک ذخیره و درنهایت عملیات مورد نظر رو روی اونها انجام بدید . منظورم اینه که شما با آدرس عکس ها سروکار دارید نه با خوده عکس ها . اینطوری حتی سرعت چاپ و بازیابی عکس هاتون رو هم به مراتب بیشتر هست .
ممنون . کمک کردی . من همینطور که گفته باینری در دیتابیس ذخیره میکنم . اگر به بن بست خوردم روش آدرس رو باید انجام بدم . فقط چند سوال
-- من یک دیتاست پاس میدم برای چاپ (عکس و اطلاعات دیگر) در این روش عکس رو چطور با دیتاست اضافه کنم ؟ باید با for ؛add کنم ؟
-- در این روش امکان مقایسه دو تا عکس فقط از طریق تبدیل به آرایه و مقایسه قابل انجامه ؟

mrprestige
یک شنبه 16 آبان 1395, 18:59 عصر
مجدد سلام دوست من ، برای سوال اولت یه مثال کوچیک میزنم که قضیه دستت بیاد که چیه . ببین به عنوان مثال شما از طریق FileStream فایل تصویری رو میخنید به این شکل

fs = new FileStream(@imagename, FileMode.Open, FileAccess.Read);
byte[] AXbyte = new byte[fs.Length];
fs.Read(AXbyte, 0, System.Convert.ToInt32(fs.Length));
fs.Close();

این تا اینجا . پس با این حال ثبت تصویر میتونه به این شکل باشه

SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("insert into axTable(ax) values(@ax)", conn );
Parameters.Add("@ax",SqlDbType.Image).Value=AXbyte;
cmd.ExecuteNonQuery();




و برای سوال دومت هم به نظرم میتونی یه روشی رو پیاده کنی . چه روشی؟! اینکه شما مثلا دوتا PicBox داری . اول تصاویر رو روی هارد رو با استفاده از stram روی picbox هامون لود میکنیم به این صورت

byte[] MyPic = new byte[0];
DataRow dR;
dR = ds.Tables["PicTable"].Rows[0];
MyPic = (byte[])dR["pic"];
MemoryStream stream = new MemoryStream(MyPic);
int picBoxCount = 2;
int currentPicBox = 0;
PictureBox[] pBoxes = new PictureBox[pictureBoxCount];
currentPicBox = (currentPicBox + 1) % picBoxCount;
pBoxes[currentPicBox].Image = Image.FromStream(stream);

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