آموزش تولید Mini Photoshop

چند درصد مفید بود؟

  • 0%

    رای: 0 0.0%
  • 25%

    رای: 0 0.0%
  • 50%

    رای: 0 0.0%
  • 75%

    رای: 0 0.0%
  • 100%

    رای: 2 100.0%

  • مجموع رای دهندگان
    2

bitaroos

Member
[FONT=&quot]سلام [/FONT]​
[FONT=&quot]اگه دوست دارید یه برنامه شبیه [/FONT][FONT=&quot]Photoshop[/FONT][FONT=&quot] بنویسید ( البته اگه خدا حال و حوصله بده) توچند قسمت می خوام اینکارو براتون بکنم[/FONT]​
[FONT=&quot]در اینجا یه قسمت از [/FONT][FONT=&quot]toolbox[/FONT][FONT=&quot] برنامه ی [/FONT][FONT=&quot]Photoshop[/FONT][FONT=&quot] رو یاد دادم البته اکسرش ترجمه ی کتاب زیره[/FONT]​
[FONT=&quot]Graphics Programming with GDI+

attachment.php


[/FONT]
[FONT=&quot]البته برای فهم این آموزشی که دادم باید یکمی [/FONT][FONT=&quot]GDI+[/FONT][FONT=&quot] بلد باشید

[/FONT]​
[FONT=&quot]قسمت های بعدی [/FONT][FONT=&quot]color piker & filters & color box & cropping & resizing & typing on image & image rotation & zooming & flipping & ….[/FONT]​
[FONT=&quot]پس منتظر باشید البته اگه خدا حال و حوصله بده



[/FONT]​
[FONT=&quot]بعد از باز کردن [/FONT][FONT=&quot]c#[/FONT][FONT=&quot] و ایجاد پروژه از نوع [/FONT][FONT=&quot]Windows Forms Application[/FONT][FONT=&quot] روی فورم ایجاد شده دابل کلیک کنید تا وارد رویداد [/FONT][FONT=&quot]load[/FONT][FONT=&quot] این فورم بشیم[/FONT]​
[FONT=&quot]FFFFFFFFFFFFFFFFFFFF[/FONT]
[FONT=&quot]private[/FONT][FONT=&quot] void Form1_Load(object sender, EventArgs e)[/FONT]
[FONT=&quot] {[/FONT]
[FONT=&quot]XXXXXXXXXXXXXXX[/FONT]
[FONT=&quot] }[/FONT]
[FONT=&quot]
حال قبل از وارد کردن کد های این رویداد، کد های زیر را در بالای
[/FONT][FONT=&quot]private[/FONT][FONT=&quot] void Form1…[/FONT][FONT=&quot] یعنی بجای [/FONT][FONT=&quot]FFFFFFFFFFFFFFFFFFFF[/FONT][FONT=&quot]وارد میکنیم[/FONT]​
[FONT=&quot]این کد ها متغیر هایی هستند که در طول برنامه ازشون استفاده میشه

[/FONT]​
HTML:
   private Bitmap bitmap = null;
          private Bitmap curBitmap = null;
          private bool dragMode = false;
          private int drawIndex = 1;
          private int curX, curY, x, y;
          private int diffX, diffY;
          private Graphics curGraphics;
          private Pen curPen;
          private SolidBrush curBrush;
          private Size fullSize;
          private Color curcolor = Color.Black;
<div align="right">[FONT=&quot]
حال کد های رویداد
[/FONT][FONT=&quot]load[/FONT][FONT=&quot] را بین { } بجای [/FONT][FONT=&quot]XXXXXXXXXXXXXXX[/FONT][FONT=&quot] وارد میکنیم[/FONT]

HTML:
   private void Form1_Load(object sender, EventArgs e)
          {
  
                // Get the full size of the form
                fullSize =  SystemInformation.PrimaryMonitorMaximizedWindowSize;
                // Create a bitmap using full size
                bitmap = new Bitmap(fullSize.Width,fullSize.Height);
                // Create a Graphics object from Bitmap
                curGraphics = Graphics.FromImage(bitmap);
                // Set background color as form's color
                curGraphics.Clear(this.BackColor);
                // Create a new pen and brush as
                // default pen and brush
                curPen = new Pen(curcolor);
                curBrush = new SolidBrush(curcolor);
  
          }
[FONT=&quot]
کد زیر اندازه ی پنجره را در
[/FONT][FONT=&quot]متغیر [/FONT][FONT=&quot]fullSize[/FONT][FONT=&quot] ذخیره می کند[/FONT]​
[FONT=&quot] fullSize = SystemInformation.PrimaryMonitorMaximizedWindowSize;[/FONT]

[FONT=&quot]کد زیر یک [/FONT][FONT=&quot]bitmap[/FONT][FONT=&quot] به ابعاد پنجره پروژه (با استفاده از [/FONT][FONT=&quot]fullSize[/FONT][FONT=&quot]) میسازد[/FONT]​
[FONT=&quot] bitmap = new Bitmap(fullSize.Width,fullSize.Height);[/FONT]

[FONT=&quot]کد زیر از [/FONT][FONT=&quot]bitmap[/FONT][FONT=&quot] یک شئ [/FONT][FONT=&quot]Graphic[/FONT][FONT=&quot] جهت ترسیم شکل های گرافیکی میسازد[/FONT]​
[FONT=&quot] curGraphics = Graphics.FromImage(bitmap);[/FONT]

[FONT=&quot]کد زیر رنگ شئ [/FONT][FONT=&quot]Graphic[/FONT][FONT=&quot] ایجاد شده در مرحله قبل رو به رنگ پس زمینه فورم تغییر میده[/FONT]​
[FONT=&quot] curGraphics.Clear(this.BackColor);[/FONT]

[FONT=&quot]در اینجا یک [/FONT][FONT=&quot]Pen[/FONT][FONT=&quot] و یک [/FONT][FONT=&quot]Brush[/FONT][FONT=&quot] ، برای نقاشی روی شئ [/FONT][FONT=&quot]Graphic[/FONT][FONT=&quot] میسازیم[/FONT]​
[FONT=&quot] curPen = new Pen([/FONT]curcolor[FONT=&quot]);[/FONT]
[FONT=&quot] curBrush = new SolidBrush([/FONT]curcolor[FONT=&quot]);[/FONT]

[FONT=&quot]حال به تب [/FONT][FONT=&quot][design][/FONT][FONT=&quot] رفته و از [/FONT][FONT=&quot]toolbox[/FONT][FONT=&quot] یک [/FONT][FONT=&quot]toolstrip[/FONT][FONT=&quot] روی فورم ایجاد می کنیم. و سه [/FONT][FONT=&quot]button[/FONT][FONT=&quot] مطابق شکل روی آن ایجاد میکنیم. و پنجره [/FONT][FONT=&quot]properties[/FONT][FONT=&quot] نام آنها را به [/FONT][FONT=&quot]btn_Elips[/FONT][FONT=&quot] و [/FONT][FONT=&quot]btn_line[/FONT][FONT=&quot] و [/FONT][FONT=&quot]btn_rect[/FONT][FONT=&quot] تغییر می دهیم[/FONT]​
[FONT=&quot]بر روی هر یک از [/FONT][FONT=&quot]button[/FONT][FONT=&quot] ها دابل کلیک میکنیم و کد رویداد [/FONT][FONT=&quot]Click[/FONT][FONT=&quot] را برای هر کدام به ترتیب[/FONT]​
[FONT=&quot]drawIndex = 1;[/FONT][FONT=&quot]و[/FONT][FONT=&quot]drawIndex = 2;[/FONT][FONT=&quot]و[/FONT]
[FONT=&quot]drawIndex = 3;[/FONT]​
[FONT=&quot]می گذاریم پس داریم[/FONT]
HTML:
private void btn_Elips_Click(object sender, EventArgs e)
          {
              drawIndex = 1;
          }
  
          private void btn_line_Click(object sender, EventArgs e)
          {
              drawIndex = 2;
          }
  
          private void btn_rect_Click(object sender, EventArgs e)
          {
              drawIndex = 3;
          }
[FONT=&quot]این کار رو کردیم تا موقع ترسیم، با توجه به عدد [/FONT][FONT=&quot]drawIndex[/FONT][FONT=&quot] ، برنامه بفهمه کدوم شکل ( خط، بیضی یا مستطیل) رو ترسیم کنه.[/FONT]​
[FONT=&quot]خوب برای ترسیم علاوه بر مشخص بودن [/FONT][FONT=&quot]drawIndex[/FONT][FONT=&quot] باید مختصات نقاط آغاز و پایان روهم از موقعیت و وضعیت موس بدست بیاریم پس می ریم سراغ 3 تا از رویداد های فورم که عبارتند از :[/FONT]​
[FONT=&quot]MouseDown[/FONT][FONT=&quot] - [/FONT][FONT=&quot]MouseMove[/FONT][FONT=&quot][/FONT][FONT=&quot]MouseUp[/FONT]​
[FONT=&quot]با انتخاب فورم در تب [/FONT][FONT=&quot]design[/FONT][FONT=&quot] و رفتن به [/FONT][FONT=&quot]پنجره [/FONT][FONT=&quot]properties[/FONT][FONT=&quot] و انتخاب [/FONT][FONT=&quot]events[/FONT][FONT=&quot] بر روی هر یک از این رویداد ها دابل کلیک کرده و کد های زیر را وارد میکنیم[/FONT]​

HTML:
private void Form1_MouseDown(object sender, MouseEventArgs e)
          {
              curX = e.X;
              curY = e.Y;
              dragMode = true;
          }
</div>
[FONT=&quot]تا اینجا با فشردن کلید موس مختصات آغاز را بدست آوردیم[/FONT]​
HTML:
private void Form1_MouseMove(object sender, MouseEventArgs e)
          {
              x = e.X;
              y = e.Y;
              diffX = e.X - curX;
              diffY = e.Y - curY;
  
              if (dragMode)
              {
                  this.Refresh();
              }
              }
</div>
[FONT=&quot]در اینجا با [/FONT][FONT=&quot]drag[/FONT][FONT=&quot] موس در هر لحظه مختصات پایانی را بدست آوردیم و از تفریق مختصات پایانی و آغازی ، طول و عرض مستطیلی را بدست می آوریم که برای رسم مستطیل و بیضی به آن احتیاج داریم. این کار را انجام می دهیم چون مل خواهیم هنگام [/FONT][FONT=&quot]drag[/FONT][FONT=&quot] پیش نمایشی از شکل داشته باشیم، برای درک بهتر- بعد از اتمام برنامه- یک بار این کد ها را به صورت کامنت در بیاورید وبرنامه را اجرا کنید، تفاوب را خواهید فهمید.[/FONT]​
[FONT=&quot]از [/FONT][FONT=&quot]dragMode = true;[/FONT][FONT=&quot] برای این استفاده کردیم تا فقط و فقط وقتی کلیک کرده ایم وهمزمان [/FONT][FONT=&quot]drag [/FONT][FONT=&quot] می کنیم، پیش نمایشی از شکل داشته باشیم.[/FONT]​
[FONT=&quot]تا اینجا وقتی کلیک کرده ایم وهمزمان [/FONT][FONT=&quot]drag [/FONT][FONT=&quot] می کنیم، شکل ایجاد شده با حرکت موس مدام تغییر می کنه(البته ترسیم در این جا با کمک رویداد [/FONT][FONT=&quot]paint[/FONT][FONT=&quot] صورت می گیرد که در ادامه بررسی می شود). حالا باید کاری کنیم که با بالا آمدن کلیک موس، شکل ایجاد شده ثابت بماند.[/FONT]​
HTML:
private void Form1_MouseUp(object sender, MouseEventArgs e)
          {
              diffX = x - curX;
              diffY = y - curY;
              switch (drawIndex)
              {
                  case 1:
                      {
                          // Draw an ellipse
                          curGraphics.DrawEllipse(curPen, curX, curY,  diffX, diffY);
                          break;
                      }
  
                  case 2:
                      {
                          // Draw a line
                          curGraphics.DrawLine(curPen, curX, curY, x,  y);
                          break;
                      }
  
                  case 3:
                      {
                          // Draw a rectangle
                          curGraphics.FillRectangle(curBrush, curX,  curY, diffX, diffY);
                          break;
                      }
              }
                  // Refresh
                  RefreshFormBackground();
                  // Set drag mode to false
                  dragMode = false;
  
          }
[FONT=&quot]در رویداد [/FONT][FONT=&quot]MouseUP[/FONT][FONT=&quot] فورم، با استفاده از مختصات و [/FONT][FONT=&quot]drawIndex[/FONT][FONT=&quot]، مکان و نوع شکل ترسیمی مشخص می شود و با استفاده از قلم [/FONT][FONT=&quot]curPen[/FONT][FONT=&quot] و دستور ِ[/FONT][FONT=&quot]DrawEllipse[/FONT][FONT=&quot] شکل تو خالی ایجاد می کنیم و با [/FONT][FONT=&quot]استفاده از قلموی [/FONT][FONT=&quot]curBrash[/FONT][FONT=&quot] و دستور ِ[/FONT][FONT=&quot]FillRectangle[/FONT][FONT=&quot] مستطیل تو پر رسم می کنیم. [/FONT]​
[FONT=&quot]متد [/FONT][FONT=&quot]RefreshFormBackground();[/FONT][FONT=&quot] که در زیر امده باعث می شود کشیدن شکل جدید باعث پاک شدن شکل قبلی نشود در واقع این کد تصویر جاری رو[/FONT][FONT=&quot]background [/FONT][FONT=&quot] فورم قرار میده.[/FONT]​
HTML:
private void RefreshFormBackground()
          {
              curBitmap = bitmap.Clone(new Rectangle(0, 0, this.Width,  this.Height), bitmap.PixelFormat);
              this.BackgroundImage = curBitmap;
          }
[FONT=&quot]اینم از رویداد [/FONT][FONT=&quot]paint[/FONT][FONT=&quot] که دیگه فکر نکنم توضیح بخواد.[/FONT]​
HTML:
private void Form1_Paint(object sender, PaintEventArgs e)
          {
               Graphics g = e.Graphics;
              // If dragMode is true, draw the selected
              // graphics shape
               if (dragMode)
               {
                   switch (drawIndex)
                   {
                       case 1:
                           {
                               g.DrawEllipse(curPen, curX, curY, diffX,  diffY);
                               break;
                           }
  
                       case 2:
                           {
                               g.DrawLine(curPen, curX, curY, x, y);
                               break;
                           }
  
                       case 3:
                           {
                               g.FillRectangle(curBrush, curX, curY,  diffX, diffY);
                               break;
                           }
  
                    }
               }
  
           }
 

پیوست ها

  • MINI Photoshop.rar
    107.6 کیلوبایت · بازدیدها: 13
  • Untitled-2.jpg
    Untitled-2.jpg
    36.2 کیلوبایت · بازدیدها: 29

جدیدترین ارسال ها

بالا