Με την βοήθεια του παρακάτω κώδικα μπορείτε να εμφανίσετε μία εικόνα μέσα σε μία άλλη χρησιμοποιώντας ως σχήμα-περίγραμμα μία τρίτη εικόνα.
Ουσιαστικά αυτό επιτυγχάνεται όταν στο χειριστήριο 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);
}
}
}
χωρίς σχόλια
RSS για τα σχόλια αυτού του άρθρου | TrackBack URL