PDA

View Full Version : سوال: جدا کردن قسمتی از یک تصویر و ذخیره آن در فایلی جدید



bita_naz
دوشنبه 17 تیر 1392, 23:42 عصر
سلام دوستان

چطور قسمتی از یک فایل تصویری را میتوان جدا کرد یا به اصطلاح Crop کرد و به عنوان یک فیل تصویری جدید ذخیره کرد ؟
البته مشکل دیگه اینه که میخام این جدا سازی به انتخاب کاربر باشه. یعنی ناحیه مورد نظر توسط کاربر انتخاب بشه. در نتیجه نیاز به ابزاری دارم تا کاربر بتونه با اون ناحیه ای مستطیلی شکل از تصویر رو انتخاب کنه. همانند چیزی که در بعضی از نرم افزار های ویرایش تصویر هست مثل Paint که یک Selector داره .

لطفا راهنمایی بفرمایید.
باتشکر

ehsan2589040
چهارشنبه 19 تیر 1392, 11:40 صبح
چهار تا مختصات را بگیر بعد با دو تا حلقه شروع کن گرفتن و set کردن پیکسل ها در یک pictureboxجدید

CsharpNevisi
چهارشنبه 19 تیر 1392, 12:08 عصر
چهار تا مختصات را بگیر بعد با دو تا حلقه شروع کن گرفتن و set کردن پیکسل ها در یک pictureboxجدید

اینطوری نمیشه ... مختصات خیلی کمتر از px است .... !!!!
مثلا نهایت X برای PictureBox برابر با 2 باشه پیکسل 8 میشه ... !!!
میشه با ظرب یه کارایی روش کرد ولی دقیق در نمیاد ... !!!

13601360
چهارشنبه 19 تیر 1392, 12:12 عصر
http://www.codeproject.com/Articles/30725/Cropping-Images

CsharpNevisi
چهارشنبه 19 تیر 1392, 12:16 عصر
اول اینو به کلاس فرمت اضافه کن :
private static Image cropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea,
bmpImage.PixelFormat);
return (Image)(bmpCrop);
}

اینم طریق استفاده :
private void button1_Click(object sender, EventArgs e)
{
pictureBox2.Image = cropImage(pictureBox1.Image, new Rectangle(10,10,100,100));
}

فقط تست نکردما ... تست کن اگر مشکلی داشت بگو برطرفش کنم .. !!!

bita_naz
چهارشنبه 19 تیر 1392, 20:12 عصر
با تشکر از همه دوستان

اگه میشه در مورد ذخیره تصویر جدید هم توضیح بفرمایید. منظورم تصویر جدیدی هست که بعد از Crop کردن به دست میاد. ذخیره اون با فرمت JPG در کامپیوتر

danialafshari
چهارشنبه 19 تیر 1392, 20:24 عصر
با تشکر از همه دوستان

اگه میشه در مورد ذخیره تصویر جدید هم توضیح بفرمایید. منظورم تصویر جدیدی هست که بعد از Crop کردن به دست میاد. ذخیره اون با فرمت JPG در کامپیوتر

pictureBox1.Image.Save(@"c:\myPic.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);

CsharpNevisi
چهارشنبه 19 تیر 1392, 20:28 عصر
با تشکر از همه دوستان

اگه میشه در مورد ذخیره تصویر جدید هم توضیح بفرمایید. منظورم تصویر جدیدی هست که بعد از Crop کردن به دست میاد. ذخیره اون با فرمت JPG در کامپیوتر

PictureBox1.Image.Save(@"c:/test.jpg");

bita_naz
چهارشنبه 19 تیر 1392, 20:35 عصر
آیا کامپوننتی میشناسید که ابزارهایی مثل Selector در نرم افزار Paint داشته باشه. واسه انتخاب بخشی از تصویر بوسیله کاربر میخام؟؟؟

CsharpNevisi
چهارشنبه 19 تیر 1392, 20:36 عصر
یعنی یه قسمت از تصویری که کاربر انتخاب میکنه رو کروپ کنه ... !!!!
اگه اینه که خوب با 2 تا متغییر کارت راه میوفته ... !!!

bita_naz
چهارشنبه 19 تیر 1392, 21:32 عصر
یعنی یه قسمت از تصویری که کاربر انتخاب میکنه رو کروپ کنه ... !!!!
اگه اینه که خوب با 2 تا متغییر کارت راه میوفته ... !!!
منظورم از لحاظ نمایش گرافیکی و کاربر پسند هستش. مثلا بیاد یک مستطیل قرمز رنگ با درگ کردن موس دور بخش انتخابی بکشه

CsharpNevisi
چهارشنبه 19 تیر 1392, 22:53 عصر
منظورم از لحاظ نمایش گرافیکی و کاربر پسند هستش. مثلا بیاد یک مستطیل قرمز رنگ با درگ کردن موس دور بخش انتخابی بکشه

خب اینم کار راحتیه ... میتونی مختصاتو بخ دست بیاری و مستلطیل رسم کنی ... !!!
مخواستی بگو سورس بزارم .. !!

bita_naz
جمعه 21 تیر 1392, 10:21 صبح
خب اینم کار راحتیه ... میتونی مختصاتو بخ دست بیاری و مستلطیل رسم کنی ... !!!
مخواستی بگو سورس بزارم .. !!
بله اگه سورس دارید بذارید. اگر در مورد مقایسه 2 تصویر هم سورس دارید لطفا بذارید

CsharpNevisi
جمعه 21 تیر 1392, 15:38 عصر
بله اگه سورس دارید بذارید. اگر در مورد مقایسه 2 تصویر هم سورس دارید لطفا بذارید

فقط مختصاتش با موس خیلی دقیق نیست که خودت تنظیمش کن

int x, y,x2,y2;
bool state = false;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
state = true;
x = e.X;
y = e.Y;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (state == true)
{
Graphics a = pictureBox1.CreateGraphics();
pictureBox1.Refresh();
a.DrawRectangle(Pens.Black, x, y, e.X, e.Y);
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
state = false;
}

bita_naz
جمعه 21 تیر 1392, 18:41 عصر
خب اینم کار راحتیه ... میتونی مختصاتو بخ دست بیاری و مستلطیل رسم کنی ... !!!
مخواستی بگو سورس بزارم .. !!
بسیار ممنون از شما
لطفا سورس جدا کردن قسمت بریده شده و سورس مقایسه رو هم بذارید

CsharpNevisi
جمعه 21 تیر 1392, 19:19 عصر
بسیار ممنون از شما
لطفا سورس جدا کردن قسمت بریده شده و سورس مقایسه رو هم بذارید

سورس جدا کردنو که بالا گذاشتم ..... !!!
و اما مقایسه ::
من واس مقایسه پیسکل به پیسکل مقایسه میکنم ... یعنی ظریب حساسیت 100% ........ بدم بهت ؟؟؟

bita_naz
شنبه 22 تیر 1392, 00:25 صبح
سورس جدا کردنو که بالا گذاشتم ..... !!!
و اما مقایسه ::
من واس مقایسه پیسکل به پیسکل مقایسه میکنم ... یعنی ظریب حساسیت 100% ........ بدم بهت ؟؟؟
بسیار ممنون از راهنمایی شما
سورس اولی فقط Select هست و Crop نداره.
ولی یک مشکلی که با اون سورس دارم اینه که پس از انتخاب یک قسمت توسط کاربر میخام اون مستطیل سر جاش بمونه و از بین نره. یک کلید بذارم واسه Clear کردنش. فکر کنم باید رویداد MousUp رو دستکاری کرد.
لطفا سورس مقایسه رو هم بدید. حساسیت 100% یعنی چی؟
آیا میشه بعد از مقایسه میزان شباهت رو بر حسب درصد مشخص کرد؟
ضمنا فکر کنم در روش شما ابتدا باید سایز دو تصویر رو یکی کرد. اگه سورس اونم دارید ممنون میشم.

CsharpNevisi
جمعه 28 تیر 1392, 21:23 عصر
بسیار ممنون از راهنمایی شما
سورس اولی فقط Select هست و Crop نداره.
ولی یک مشکلی که با اون سورس دارم اینه که پس از انتخاب یک قسمت توسط کاربر میخام اون مستطیل سر جاش بمونه و از بین نره. یک کلید بذارم واسه Clear کردنش. فکر کنم باید رویداد MousUp رو دستکاری کرد.
لطفا سورس مقایسه رو هم بدید. حساسیت 100% یعنی چی؟
آیا میشه بعد از مقایسه میزان شباهت رو بر حسب درصد مشخص کرد؟
ضمنا فکر کنم در روش شما ابتدا باید سایز دو تصویر رو یکی کرد. اگه سورس اونم دارید ممنون میشم.

این از بریدن عکس (البته مختصات خیلی دقیق نیست)

int x, y, x2, y2;
bool state = false;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
state = true;
x = e.X;
y = e.Y;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (state == true)
{
Graphics a = pictureBox1.CreateGraphics();
pictureBox1.Refresh();
a.DrawRectangle(Pens.Red, x, y, e.X, e.Y);
}
}

private static Image cropImage(Image img, Rectangle cropArea)
{
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
return (Image)(bmpCrop);
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
state = false;
Graphics a = pictureBox1.CreateGraphics();
pictureBox1.Refresh();
System.Drawing.Drawing2D.HatchBrush Br = new System.Drawing.Drawing2D.HatchBrush(System.Drawing .Drawing2D.HatchStyle.Weave, Color.Red, Color.Transparent);
a.FillRectangle(Br, x, y, e.X, e.Y);
a.DrawRectangle(Pens.Blue, x, y, e.X, e.Y);
pictureBox2.Image = cropImage(pictureBox1.Image, new Rectangle(x +36 , y + 100, e.X + 160, e.Y + 350));
}

اینم از مقایسه دوتا عکس :
bool a = true;
Bitmap pic1 = new Bitmap(pictureBox3.Image);
Bitmap pic2 = new Bitmap(pictureBox4.Image);
for (int i = 0; i <= pictureBox3.Width; i++)
{
for (int j = 0; j <= pictureBox3.Height; j++)
{
Color a1, a2;
a1 = pic1.GetPixel(i, j);
a2 = pic2.GetPixel(i, j);
if (a1 != a2)
{
a = false;
}
}
}
if (a == false)
{
MessageBox.Show("یکی نیستند");
}
else
{
MessageBox.Show("یکی هستند");
}

hamid_73
جمعه 01 فروردین 1393, 21:56 عصر
داداش برا کراپ کردن من کداتون رو وارد کردم وقتی روی عکس کلیک می کنی روی این خط ارور میده
Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
میزنه
out of memory