PDA

View Full Version : سوال: save کردن اشکال ترسیم شده روی فرم



desatir7316
دوشنبه 11 بهمن 1389, 19:01 عصر
سلام دوستان
با چه دستورهایی میشه اشکالی رو که روی یه فرم میشکشیم رو به صورت یک عکس سیو کنیم و بعدا هم بتونیم این تصویر رو لود کرده و دوباره روی اون اشکال جدید بکشیم
ممنون میشم پاسخ بدین
تا آخر هفته باید پروژمو تحویل بدم

desatir7316
سه شنبه 12 بهمن 1389, 13:36 عصر
دوستان هیچ کس دستور save کردن عکس رو بلد نیست؟:گریه:
لطفا کمک کنید
:خجالت:

ali.rezaei7
سه شنبه 12 بهمن 1389, 18:22 عصر
درود. هيچ متدي آماده اي براي انجام چنين كاري وجود نداره. اما مي شه با برنامه نويسي اين كارو انجام داد. شما مي توني يك نسخه از اشكال ترسيم شده را در آبجكتي از Bitmap قرار بديد. و در انتها آبجكت رو با استفاده از متد Save، در داخل يك فايل ذخيره كني. از طرفي هم كلاس Bitmap امكانات رسم اشكال هندسي رو نداره و براي انجام اينكار، مجبوريم كه از متد SetPixel براي ترسيم شكل ها استفاده كنيم كه راه دشواري هست. خوشبختانه راهي براي رسم اشكال بصورت غير مستقيم در Bitmap وجود داره؛ ايجاد يك آبجكت Graphic بوسيله يك آبجكت Bitmap.



Bitmap BitmapPaint = new Bitmap("FileName");
Graphics GraphPaint= Graphics.FromImage(BitmapPaint);
حالا نوبت به رسم شكل ها مي رسه. فقط كافيه كه بعد از رسم شكل برروي فرم، يه نسخه ديگه از اون رو بوسيله آبجكت GraphPaint انجام بدي. با اينكار شكل در آبجكت BitmapPaint هم رسم مي شه.در آخر هم بوسيله متد Save آبجكت Bitmap شكل موردنظرو ذخيره مي كنيم.
اين مثال يه عكسي رو وارد برنامه مي كنه و بعد از اون يه مستطيل روش رسم ميكنه و ذخيرش مي كنه:


Bitmap BitmapPaint = new Bitmap("FileName");

Graphics GraphForm= this.CreateGraphics();
Graphics GraphPaint=Graphics.FromImage(BitmapPaint);

GraphForm.DrawImageUnscaled(BitmapPaint, 0, 0); //Draw image on Form
GraphForm.DrawRectangle(new Pen(Color.Black), new Rectangle(200, 200,30,30));//Draw a rectangle on the form

GraphPaint.DrawRectangle(new Pen(Color.Black), new Rectangle(200, 200, 30, 30));

GraphPaint.Dispose();
GraphForm.Dispose();

BitmapPaint.Save("C:\\ABC.BMP");
اصل ماجرا اين بود. ديگه مابقي خورده كاري ها با خودت.
موفق باشي.

desatir7316
سه شنبه 12 بهمن 1389, 18:38 عصر
درود اهورامزدا بر تو باد
مرسی

desatir7316
سه شنبه 12 بهمن 1389, 19:14 عصر
دوست عزیز کدی که دادی خیلی کارآمد بود
حالا اگه نخوام هیچ عکسی رو توی فرمم لود کنم و خود اشکال ترسیم شده روی فرم رو ذخیره کنم باید چی کار کنم
ممنون میشم اینم بگی

ali.rezaei7
سه شنبه 12 بهمن 1389, 19:21 عصر
كافيه بجاي مسير يه فايل، عرض و ارتفاع به آبجكتت بدي: Bitmap BitmapPaint=new Bitmap(500,500)

desatir7316
سه شنبه 12 بهمن 1389, 22:08 عصر
دوست عزیز منون که پی گیر مشکلات من هستی
من کد شما رو متوجه شدم
ولی به این مشکل رسیدم
من یه اینترفیس دارم که از اون یه آرایه تعریف کرم و تمام اشیایی که روی فرمم کشیدم داخل این آرایه موجود اند(تک تک به آرایه اضافه شدن)
نمی تونم تک تک اونا رو به graphPaint اضافه کنم چون هر کدوم از این اشکال خاصیت جابجایی و تغییر اندازه هم دارند
حالا چطوری میتونم عناصر این آرایه رو داخل graphpaint بریزم که بتونم توی فایل عکس رسمشون کنم؟



private IShape[] shp = new IShape[1000];
.
.
.
for (int i=0; i <= shpCount; i++)
if(shp[i]!=null)
shp[i].draw();


بازم ازت ممنونم

ali.rezaei7
چهارشنبه 13 بهمن 1389, 10:40 صبح
من كه از ساختار اينترفيس و برنامت خبر ندارم. اينترفيسرو بازترش كن تا ببينيم چي ميشه.

desatir7316
چهارشنبه 13 بهمن 1389, 14:21 عصر
قبل از هر چیز باید ازت تشکر کنم


interface IShape
{
void draw();
void move(Point a);
void resize(Point a, int ChangeType);
bool isClick(Point a);
void save();
void load();
int selectedArea(Point a);

}

متد draw برای رسم
متد move برای جابجای شی رسم شده
متد resize برای تغییر اندازه که با توجه به مقدار changeType تغییر اندازه به صورت های زیر انجام میشه
اگره changeType برابر 1 باشه جابجایی داره از سمت بالا و چب مستطیل انجام میشه
اگره changeType برابر2 باشه جابجایی داره از سمت بالا و راست مستطیل انجام میشه
اگره changeType برابر 3 باشه جابجایی داره از سمت پایین و چب مستطیل انجام میشه
اگره changeType برابر 4 باشه جابجایی داره از سمت پایین و راست مستطیل انجام میشه
مقدار changeType رو قبلا توسط متد selectedArea مشخص شده
متد isClick مشخص میکنه که ماوس برای جابجایی یا تغییر اندازه روی یکی از اشکال قرار داره یا نه که اگر باشه مقدار true برمی گردونه که اینم کدش که توی فرم نوشته شده شاید لازمت بشه


if (selectedMode == Mode.move)
{
bool s = false;
for (int i = 0; i < shpCount; i++)
if (shp[i].isClick(e.Location) == true)
s = true;

if (s == true)
this.Cursor = System.Windows.Forms.Cursors.Hand;
else
this.Cursor = System.Windows.Forms.Cursors.Default;

if (down == true)
{
if (selectedShp != null)
{
temp2.X=e.X-temp1.X;
temp2.Y = e.Y - temp1.Y;
selectedShp.move(temp2);
Refresh();
temp1 = e.Location;
}
}
else
selectedShp = null;
}


برای نمونه مثلا کلاس مستطیل رو هم کدشو می ذارم که از این اینترفیس ارث بری کرده



class Rectangle:IShape
{
private Point start, end, distance;
private Graphics mysheet;
Pen p;
bool fill;
public Rectangle(Point a,Point b, bool f, Graphics g,Pen p1)
{
start = a;
end = b;
mysheet = g;
fill = f;
p = p1;

//----------------------------------- determine type of draw -----------------------------------------------
if(end.X==1 && end.Y==1) //specially for spray
distance=new Point(1,1);
else if (start.X <= end.X && start.Y <= end.Y) // type 1
distance = new Point(end.X - start.X, end.Y - start.Y);
else if (start.X >= end.X && start.Y <= end.Y) //type 2
{
distance = new Point(start.X - end.X, end.Y - start.Y);
start = new Point(end.X, start.Y);
}
else if (start.X >= end.X && start.Y >= end.Y) //type 3
{
distance = new Point(start.X - end.X, start.Y - end.Y);
start = end;
}
else if (start.X <= end.X && start.Y >= end.Y) // type 4
{
distance = new Point(end.X - start.X, start.Y - end.Y);
start = new Point(start.X, end.Y);
}

}


#region IShape Members

public void draw()
{
if (fill == true)
mysheet.FillRectangle(new SolidBrush(p.Color), start.X, start.Y, distance.X, distance.Y);
else if (fill == false)
mysheet.DrawRectangle(p, start.X, start.Y, distance.X, distance.Y);

}

public void move(Point a)
{
start = new Point(start.X + a.X, start.Y + a.Y);
}

public void resize(Point a, int ChangeType)
{
const int fetherStep = 15;
a.X /= fetherStep;
a.Y /= fetherStep;

if (ChangeType == 1)
{
start = new Point(start.X + a.X, start.Y + a.Y);
distance = new Point(distance.X - a.X, distance.Y - a.Y);
}
else if (ChangeType == 2)
{
start = new Point(start.X, start.Y + a.Y );
distance = new Point(distance.X + a.X , distance.Y - a.Y );
}
else if (ChangeType == 3)
{
start = new Point(start.X + a.X, start.Y);
distance = new Point(distance.X - a.X, distance.Y + a.Y);
}
else if (ChangeType == 4)
distance = new Point(distance.X + a.X, distance.Y + a.Y);
}

public bool isClick(Point a)
{
if (a.X >= start.X && a.X <= start.X+distance.X &&
a.Y >= start.Y && a.Y <= start.Y+distance.Y)
return true;
return false;
}

public void save()
{
throw new NotImplementedException();
}

public void load()
{
throw new NotImplementedException();
}

public int selectedArea(Point a)
{
if (a.X >= start.X && a.X <= start.X + (distance.X / 2) &&
a.Y >= start.Y && a.Y <= start.Y + (distance.Y / 2))
return 1;

else if (a.X >= start.X + (distance.X / 2) && a.X <= start.X + distance.X &&
a.Y >= start.Y && a.Y <= start.Y + (distance.Y / 2))
return 2;

else if (a.X >= start.X && a.X <= start.X + (distance.X / 2) &&
a.Y >= start.Y + (distance.Y / 2) && a.Y <= start.Y + distance.Y)
return 3;

else if (a.X >= start.X + (distance.X / 2) && a.X <= start.X + distance.X &&
a.Y >= start.Y + (distance.Y / 2) && a.Y <= start.Y + distance.Y)
return 4;

else
return 0;

}


#endregion
}


شرمنده اگر طولانی شد
این کلاس الان بدون مشکل کار میکنه

حالا اینم یه نمونه از ساخت شس ار مستطیل و اضافه کردن به اون آرایه که از اینترفیس ساخته شده



Rectangle n = new Rectangle(temp1, e.Location,drawFill, CreateGraphics(), p);
n.draw();
shp[shpCount++] = n;


بازم ممنونم

ali.rezaei7
چهارشنبه 13 بهمن 1389, 17:00 عصر
تا اونجايي من، از كدي كه گذاشتي كه متوجه شدم، شما تو انتقال اشكال رسم شده، از فرم به آبجكت GraphPaint دچار مشكل شدي. درسته؟
خب شما برعكس اينكارو انجام بده ابتدا اشكالو در GraphPaint رسم كن. بعد براي نمايش، اونو به فرم انتقال بده.

desatir7316
پنج شنبه 14 بهمن 1389, 17:37 عصر
ali.rezaei7 عزیز ممنون به خاطر همه کمک هات
شرمنده که دیر جواب دادم
اینترنتم مشکل پیدا کرده بود
در پاسخ به سوالت باید بگم که مشکل من این بود که اشیایی که توی فرم تغییر اندازه پیدا می کنن یا جابجا می شن رو چطوری باید توی graphPaint تغییر اندازه بدم و جابجا کنم
ولی یه جورایی حل شد ه :
نه شکل هامو توی graphPaint رسم کردم و تغییر اندازه دادم و نه جابجا کردم فقط موقع ذخیره عکس با کمک تابع CopyFromScreen از اون قسمتی که خواسم یه عکس گرفتم و بعد توی graphPaint قرار دادم و ذخیره کردم
این تابع کاری شبیه دکمه printScreen کیبورد میکنه که البته خودتون استادید و نیازی به توضیح این چیزها نیست