PDA

View Full Version : سوال: ایجاد یک عکس در picturebox و رسم یک خط روی ان و ذخیره عکس



farhadr1375
سه شنبه 12 خرداد 1394, 01:48 صبح
سلام. من میخام رو picturebox یه عکس ایجاد کنم با بکگراند سفید . بعد روی این عکس یه متن بنویسم و بعد عکس رو ذخیره کنم.
میشه کدش رو راهنمایی کنید ؟؟

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


من کلا این کد رو نوشتم





Bitmap b = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(b);
g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));
g.DrawString("hello", new Font("Times New Roman", 20), new SolidBrush(Color.Red), new PointF(10, 10));
pictureBox1.Image = b;



برای ایجاد بک گراند سفید از این کد استفاده کردم


g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));

منتها بعد از اینکه متن روی عکس نوشته شد ، دوباره بخام با کد بالا رنگ بکگراند رو عوض کنم اون متن هم از بین میره، راه حل این مشکل چیه ؟ میخام بدون اینکه صدمه ای به متن ها و اشکالی که رو عکس کشیده میشن وارد بشه بتونم رنگ بک گراند رو عوض کنم

asman.abi
سه شنبه 12 خرداد 1394, 15:21 عصر
خب مسلما درست کار نمی کنه. چرا؟
برای این که شما وقتی دوباره دستور FillRectangle رو اجرا می کنید، کل picturebox که تنظیم کردید پر می شه از رنگ انتخابی شما.

برای حل این مسئله باید دوباره نوشته مورد نظر رو بازنویسی کنی که یه شکل جدید با رنگی که در مرتبه دوم انتخاب کردید، تشکیل بشه.

g.FillRectangle(new SolidBrush(Color.blue), new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height));
g.DrawString("سلام", new Font("Times New Roman", 20), new SolidBrush(Color.Red), new PointF(10, 10));

RmeXXXXXXXXX
سه شنبه 12 خرداد 1394, 16:46 عصر
درسته. شما موقعی ک بخواهید رنگ پس زمینه رو عوض کنید هیچ راهی ندارید وباید قبل از هر گونه رسم شکل اینکارو انجام بدین. چرا؟ شی تصویر رو وایت برد (whiteBoard) در نظر بگیرید! و شی گرافیک رو ماژیک . شما هیچ راهی برای تغییر رنگ پس زمینه ندارین مگه اینکه کل برد رو رنگ کنید و مسلماً چیزایی که ترسیم کردین از بین میرن. برای این کار هم صحیح تر اینه که از متد g.Clear(yourBgColor) استفاده کنین.
اگه واقعاً نیاز به این کاردارین (ارزششو داشته باشه) باید دست به دامن داده ساختارها بشین.
مثلاً یه پشته!:
برای هر شکلی که ترسیم میشه (خصوصیاتی که باعث ترسیم میشه) رو طی یک سلسله مراتب وراثت پیاده کنید و اصطلاحاً رکورد سابقه تعریف کنید. مثلاً رکورد ترسیم مستطیل، ترسیم دایره، متن، خط و ...
وقتی کاربر شکلی رو ترسیم کرد همزمان رکورد سابقه براش تشکیل بدین و پشته درج کنید. اینجوری با حرکت بین رکوردها قابلیت Undo و Redo رو پیدا میکنید. حال اگه کاربر نیاز به تغییر پس زمینه داشت مشکلی نیست اونو تغییر میدیم و در ادامه برحسب رکوردهای سابقه ای که داریم دوباره اشیا رو رسم میکنیم.
من این کار رو انجام دادم 4-5 سال پیش توی برنامه Paintی ک نوشتم (تازه کار)

farhadr1375
سه شنبه 12 خرداد 1394, 17:19 عصر
ممنون از پاسخ شما. حالا فرض کنید که کاربر صدتا خط رو عکس کشیده و ده تا تکست نوشته و ده تا دایره کشیده ، حالا اگه بخاط رنگ بکگراند رو عوض کنه باید دوباره تمام اون اشکال رو از نو کشیده بشن؟؟ ینی هیچ راهی نداره بدون اینکه صدمه ای به اون شکل ها وارد بشه رنگ پس زمینه رو تغییر داد؟