Μάσκα εικόνας για διαφανή γραφικά σε C#

Μάσκα εικόνας για διαφανή γραφικά σε C#

Με την βοήθεια του παρακάτω κώδικα μπορείτε να εμφανίσετε μία εικόνα μέσα σε μία άλλη χρησιμοποιώντας ως σχήμα-περίγραμμα μία τρίτη εικόνα.

Ουσιαστικά αυτό επιτυγχάνεται όταν στο χειριστήριο picturebox που βρίσκεται μέσα στην φόρμα, χρησιμοποιείται μία εικόνα που προσδιορίζει τα ορατά ή όχι pixels. Στις θέσεις των μη-ορατών pixel εμφανίζονται τα γραφικά που βρίσκονται πίσω από το χειριστήριο (εικόνα της φόρμας – Background) ενώ τα ορατά απεικονίζουν την εικόνα που περιέχεται στο ίδιο το χειριστήριο.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace transparent

{

public partial class Form1 : Form

{

//ορισμός 10 εικόνων (για μάσκες)

private const int max_msk=10;

Bitmap [] msk= new Bitmap[max_msk];

Bitmap backg;

//καταχώρηση των γραφικών ανα μάσκα στα παρακάτω αντικείμενα

PictureBox[] pcbox = new PictureBox[max_msk];

public Form1()

{

InitializeComponent();

//φόρτωση του φόντου

backg=(Bitmap) Image.FromFile(“back.jpg”);

for (int a = 1; a < (max_msk+1); a++)

{

//φόρτωση όλων των γραφικών(μασκες)

msk[a-1]=(Bitmap) Image.FromFile(“msk” + a.ToString() + “.jpg”);

pcbox[a - 1] = new PictureBox();

//ορισμός των διαστάσεων

pcbox[a - 1].Width = pic1.Width;

pcbox[a - 1].Height = pic1.Height;

//κλίση συνάρτησης δημιουργίας διαφανούς γραφικού

transparent.make_pic_transparent(pcbox[a - 1], msk[a - 1]);

//φόρτωση του γραφικού που θα εμφανιστεί (στα ορατά pixel)

pcbox[a - 1].BackgroundImage = backg;

}

//εμφάνιση του φόντου

pic1.BackgroundImage = (Bitmap)Image.FromFile(“back.jpg”);

}

static int ct = 0;

private void run_me_Click(object sender, EventArgs e)

{

//εμφάνιση του γραφικού με άλλο περίγραμμα, σύμφωνα με την μασκα που φορτώθηκε

if (ct<max_msk) pic1.Region = pcbox[ct].Region;

ct = (ct + 1) ;

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{

//αλλαγή θέσης του χειριστηρίου picturebox μέσα στην φόρμα

if (e.Button == MouseButtons.Left)

{

pic1.Left = e.X;

pic1.Top = e.Y;

}

}

private void Form1_Load(object sender, EventArgs e)

{

}

}

}

/* τάξη transparent */

using System;

using System.Collections.Generic;

using System.Text;

//απαραίτητες βιβλιοθήκες για αυτή την τάξη

using System.Drawing.Drawing2D;

using System.Windows.Forms;

using System.Drawing;

namespace transparent

{

class transparent

{

//χρησιμοποίησε το πρώτο pixel του bitmap για καθορισμό της μάσκας

public static void make_pic_transparent(PictureBox pic, Bitmap natural_bitmap)

{

make_pic_transparent(pic, natural_bitmap, natural_bitmap.GetPixel(0, 0));

}

//δημιούργησε διαφανή εικόνα

public static void make_pic_transparent(PictureBox pic, Bitmap natural_bitmap, Color mask_trans)

{

Bitmap bt = new Bitmap(natural_bitmap, new Size(pic.Width, pic.Height));

GraphicsPath path_gr = make_gr_path(bt, mask_trans.ToArgb());

pic.Region = new Region(path_gr);

pic.BackgroundImage = bt;

}

//υπολογισμός των εμφανιζόμενων πixel

public static GraphicsPath make_gr_path(Bitmap bitmap, int colorTransparent)

{

GraphicsPath graphicsPath = new GraphicsPath();

int colOpaquePixel = 0;

Color trn=new Color();

trn=Color.FromArgb(colorTransparent);

double deep = 30;

//ο παρακάτω κώδικας σαρώνει και ανιχνεύει της περιοχές-pixel που ταιριάζουν

//κατα προσέγγιση στην απόχρωση με το χρώμα που έχει οριστεί στο colorTransparent

//Κάθε περιοχή που βρίσκει οτι τα γραφικά δεν θα είναι διαφανή, προσθέτει

//μέσω της συνάρτησης graphicsPath.AddRectangle το τμήμα αυτό ως εμφανιζόμενο τμήμα της εικόνας

for (int row = 0; row < bitmap.Height; row++)

{

colOpaquePixel = 0;

for (int col = 0; col < bitmap.Width; col++)

{

//έλεγχος αν τα χρώματα είναι περίπου ίδια με αυτά της μάσκας ή οχι

if (! cmp_color (bitmap.GetPixel(col, row),trn,deep))

{

colOpaquePixel = col;

int colNext = col;

for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)

{

if (cmp_color(bitmap.GetPixel(colNext, row), trn, deep)) break;

}

graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext – colOpaquePixel, 1));

col = colNext;

}

}

}

//επιστρέφει την μασκα που υπολογίστηκε

return graphicsPath;

}

//η cmp_color υπολογίζει αν οι αναλύσεις του χρώματος κάθε pixel σε RGB

//με το χρώμα της μάσκας που επιλέχθηκε έχουν διαφορές μεγαλύτερες ή οχι απο μία ορισμένη τιμή (decline)

//αυτό είναι χρήσιμο λόγο του γεγονότος οτι οι αποχρώσεις των bitmap είναι πολλές

//και δεν θα μπορούσε να επιτευχθεί διαχωρισμός χρωμάτων με μία τιμή μόνο.

private static bool cmp_color(Color cl1, Color cl2, double decline)

{

return (

Math.Abs (cl1.R-cl2.R)<decline &&

Math.Abs (cl1.G-cl2.G)<decline &&

Math.Abs(cl1.B-cl2.B)<decline);

}

}

}

Blog Widget by LinkWithin

Post to Twitter Post to Delicious Delicious



χωρίς σχόλια »

χωρίς σχόλια

RSS για τα σχόλια αυτού του άρθρου | TrackBack URL

γράψτε ένα σχόλιο