Membuat Paint App dengan C# dan GDI+ (Part 1)

Sesudah anda membaca tutorial saya yang sebelumnya tentang pemrograman GDI+ dengan C# Part 1 dan 2 maka pada kesempatan ini saya akan melanjutkannya dengan membuat sebuah contoh yang simple agar penerapan GDI+ menjadi lebih mudah untuk dimengerti

Pada tutorial kali ini saya akan mengajak anda untuk mencoba beberapa fitur yang ditawarkan oleh library GDI+ dan C# untuk membuat sebuah aplikasi pengolah citra yang sederhana (mirip aplikasi paint). Aplikasi ini juga saya gunakan sebagai tugas untuk mahasiswa yang mengambil matakuliah komputer grafis.

Untuk membuat aplikasi ini pertama-tama anda harus membuat design form sebagai berikut:

image 

kemudian deklarasikan beberapa variabel yang akan digunakan pada aplikasi ini

private Bitmap bitmap = null;
private Bitmap curBitmap = null;
private bool dragMode = false;
private bool boolFill = false;
private int drawIndex = 1;
private int curX, curY, x, y;
private int diffX, diffY;
private Graphics curGraphics;
public Pen curPen;
private SolidBrush curBrush;
private Size fullSize;

private Color borderColor = Color.Black;
private Color fillColor = Color.White;

private Image currImage = null;
private string currFilename = "";

pada saat form di load buat object Bitmap dan Graphic sebagai berikut,

private void Form1_Load(object sender, EventArgs e)
{
    //cek ukuran display monitor
    fullSize = SystemInformation.PrimaryMonitorMaximizedWindowSize;
    //buat object bitmap baru
    bitmap = new Bitmap(fullSize.Width,fullSize.Height);
    //buat object graphic baru
    curGraphics = Graphics.FromImage(bitmap);
    curPen = new Pen(Color.Black);
    curBrush = new SolidBrush(Color.Black);
}

pada saat event MouseDown pada form simpan titik (x,y)

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    curX = e.X;
    curY = e.Y;
    dragMode = true;
}

pada saat event MouseMove, hitung height dan width dari titik awak ke titik akhir

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    x = e.X;
    y = e.Y;
    //hitung beda antara titik awal dan akhir(pada saat move)
    diffX = e.X - curX;
    diffY = e.Y - curY;

    if (dragMode)
    {
        this.Refresh();
    }
}

Pada saat event MouseUp gambar dulu objectnya (rectangle, pen, atau, ellipse). Penggambaran object ini bukan di form melainkan pada object Graphic yang akan digunakan sebagai background agar setelah digambar object gambar yang lama tidak hilang.

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    diffX = x - curX;
    diffY = y - curY;

    switch (drawIndex)
    {
        case 1:
            //gambar garis
            curGraphics.DrawLine(curPen, curX, curY, x, y);
            break;
        case 2:
            //gambar ellipse
                curGraphics.DrawEllipse(curPen, curX, curY, diffX, diffY);
            break;
        case 3:
            //gambar kotak
                curGraphics.DrawRectangle(curPen, curX, curY, diffX, diffY);
            break;
    }

    RefreshFormBackground();
    dragMode = false;
}

Pada event Paint di form gambar objecnya

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    if (currImage != null)
    {
        g.DrawImage(currImage, AutoScrollPosition.X, AutoScrollPosition.Y+pnlMenu.Height, currImage.Width, currImage.Height);
        curGraphics.DrawImage(currImage, AutoScrollPosition.X, AutoScrollPosition.Y+pnlMenu.Height, currImage.Width, currImage.Height);
        RefreshFormBackground();
        currImage = null;
    }

    if (dragMode)
    {
        switch (drawIndex)
        {
            case 1:
                //gambar garis
                g.DrawLine(curPen, curX, curY, x, y);
                break;
            case 2:
                //gambar ellipse
                    g.DrawEllipse(curPen, curX, curY, diffX, diffY);
                break;
            case 3:
                //gambar kotak
                    g.DrawRectangle(curPen, curX, curY, diffX, diffY);
                break;
        }
    }
}

method RefreshFormBackground() digunakan untuk menjadikan object curGraphic sebagai background form

private void RefreshFormBackground()
{
    curBitmap = bitmap.Clone(new Rectangle(0, 0, this.Width, this.Height), bitmap.PixelFormat);
    this.BackgroundImage = curBitmap;
}

setelah itu coba anda jalankan programnya dan mencoba menggambar object line atau rectangle sebagai berikut

image

untuk menambahkan pewarnaan fiil, border, open, dan save file akan dibahas di artikel selanjutnya, selamat mencoba

have fun guys.. coding is fun :)

Ditulis dalam C#. Tag: , , , , . 8 Komentar »

8 Tanggapan ke “Membuat Paint App dengan C# dan GDI+ (Part 1)”

  1. Naser Says:

    Halo, salam kenal nama saya naser. saya baru aja belajar c#. niatnya sekaligus untuk mengerjakan tugas akhir, karena tugas akhir saya berkaitan dengan pengolahan citra. sebelumnya saya menggunakan visual basic .NET. tetapi setelah mencoba C# sepertinya ini lebih enak dan lebih banyak referensinya. Terima kasih untuk contohnya….

  2. Erick Kurniawan Says:

    salam kenal juga mas naser, senang bisa membantu, yup sebenernya pake c# dan vb.net itu sama saja kok cm masalah selera saja, seperti memilih ice cream suka yg vanilla atau yg coklat, karena pada dasarnya semua component yang digunakan sama yaitu .NET Framework, cuman untuk aplikasi berbasis windows vb.net emang didesain lebih mudah digunakan dan tidak strict seperti c#

  3. Aria Perdana Says:

    halo,
    ada beberapa hal yang ingin saya tanyakan mengenai aplikasi ini.
    1. variabel drawIndex digunakan untuk apa?
    2. pada design form, pemilihan untuk menggambar diwakili oleh tool apa?
    3. mengapa variabel diffx dan diffy tidak digunakan untuk menggambar line?
    untuk jawabannya saya ucapkan terima kasih.

  4. Erick Kurniawan Says:

    halo mas aria :) saya akan coba jawab pertanyaannya
    1) variabel drawIndex digunakan untuk mengecek bentuk (shape) apa yang akan digambar line, elipse, atau rec
    2)Untuk tools hanya menggunakan tombol biasa mas, trus buat image untuk jadi imagenya :)
    3)diffX dan diffY digunakan untuk mengetahui jarak antar titik ketika menggambar rec dan ellipse

    mungkin klo mas tertarik saya bisa kasi source nya, ada alamat email mas?

  5. Aria Perdana Says:

    Halo mas erick,
    Terima kasih atas jawabannya. benar-benar menolong sekali.

    saya sangat tertarik mas sama aplikasi buatan mas. ini email saya, perdana.aria@gmail.com

    Terima kasih banyak ya mas erick.

  6. Erick Kurniawan Says:

    ok mas aria sudah saya kirim filenya, semoga membantu ^_^

  7. haikal Says:

    aku juga dunk.. kirim ke emailku haikalajadeh@yahoo.com


Tinggalkan Balasan