Blitting image c#

lunedì 14 maggio 2007 - 15.12

Francesca1983 Profilo | Newbie

Ciao a tutti...

eccomi di nuovo qui con un nuovo quesito:

devo gestire lo zoom su parti di mappe...avendo però il terminale solo a touch-screen devo gestire l'evento mouseClick...

In sostanza il mio programma parte con una form nella quale è visualizzata l'immagine di una mappa; al click dell'utente su una parte di essa la porzione di rettangolo (di dim stabilite da me) della parte selezionata deve essere visualizzata in un altro picture box avendo coì la possibilità di zoommarla...

ho trovato poco sull'argomento...che viene chiamato "blit" o "blitting"....

Se qualcuno mi potesse aiutare...

Grazie mille Francesca

munissor Profilo | Senior Member

puoi usare una cosa del genere

Bitmap part = new Bitmap(WIDTH, HEIGHT); for(int x=0; x<WIDTH; x++) { for(int y=0;y<HEIGTH;x++) { Color tmp = map.GetPixel(x+offsetX,y+offsetY); part.SetPixel(x,y, tmp); } }


dove offsetX e offsetY sono il numero di pixel (dall'angolo superiore sx) da cui iniziare a prendere il rettangolo, WIDTH e HEIGHT sono le dimensioni in pixel del rettangolo che devi estrarre...

Attenzione che questo metodo non è molto efficiente, se devi manipolare immagini molto grandi conviene usare la coppia LockBits, UnlockBits, sempre della classe Bitmap che però hanno degli svantaggi:
1) devi utilizzare codice unsafe
2) devi avere un po' di esperienza su GDI perchè devi manipolare l'immagine in memoria quindi il rischio di sbagliare e la complessità del codice aumentano

ciao.

Francesca1983 Profilo | Newbie

grazie...ho provato a utilizzare il codice che mi hai fornito, solo una domanda:

l'oggetto "map" che utilizzi in questa parte:

>Color tmp = map.GetPixel(x+offsetX,y+offsetY);


che tipo di oggetto è?
Perchè io ho provato ad utilizzare l'immagine della mia pictureBox di partenza...

Color tmp = pictureBox1.Image...

ma non contiene il metodo GetPixel...

Forse è un oggetto diverso??
Grazie mille!!!

Francesca


Francesca1983 Profilo | Newbie

OK....trovato è un oggetto di tipo Bitmap...

Il problema ora è un altro...

Quando uso il SetPixwel è come il Drawing?? Perchè il programma si compila benen, ma quando vado ad eseguirlo e clikko sull'immagine non mi ridisegna la parte selezionata....
Come faccio a dirgli che la voglio ridisegnata nella pictureBox2???

Grazie mille

Frency

Francesca1983 Profilo | Newbie

Ecco il programma che ho fatto:

private void Form1_Paint(object sender, PaintEventArgs e) { if (click == true) { Rectangle rec = new Rectangle(10, 40, 10, 4); for (int x = 0; x < 10; x++) { for (int y = 0; y < 4; y++) { e.Graphics.DrawRectangle(new Pen(tmp[x, y], 4), rec); } } click = false; } } public int cheX, cheY; public Bitmap part = new Bitmap(50, 50); public Color[,] tmp = new Color[10, 4]; public void pictureBox1_MouseClick(object sender, MouseEventArgs e) { cheX = e.X; cheY = e.Y; Bitmap map = new Bitmap(pictureBox1.Image); for (int x = 0; x < 10; x++) { for (int y = 0; y < 4; y++) { tmp[x,y] = map.GetPixel(x + cheX, y + cheY); part.SetPixel(x, y, tmp[x,y]); } } click = true; }


se ho capito bene la variabile "tmp" (matrice) contiene il colore selezionato...poi setto una variabile bool a true che mi serve per disegnare la parte di immagine selezionata, i problemi sono 2:

1. se non metto un break all'interno dell'evento "Mouse_Click" non mi esegue il codice;

2. mettendo il break mi disegna nel punto selezionato un immagine ma con i colori delle coordinate come se avessi clikkato in (0,0)...nonostante che la matrice colore me la carica con i colori giusti...



Uff....

Francesca1983 Profilo | Newbie

Ho risolto in questo modo:

// Copies a part of a bitmap. protected Bitmap CopyBitmap(Bitmap source, Rectangle part) { int x = 0; int y = 0; Bitmap bmp = new Bitmap(part.Width, part.Height); Graphics g = Graphics.FromImage(bmp); g.DrawImage(source, x, y, part, GraphicsUnit.Pixel); return bmp; } private void pictureBox1_MouseClick(object sender, MouseEventArgs e) { Rectangle myRect = new Rectangle(e.X , e.Y , 100, 200); Bitmap mySource = new Bitmap(pictureBox1.Image); Bitmap myDest = new Bitmap(pictureBox2.Image); myDest = CopyBitmap(mySource, myRect); pictureBox2.Image = myDest; }

Magari non è performante ma funziona...

Ciao ciao

munissor Profilo | Senior Member

Si scusa per il ritardo..map era l'oggetto bitmap originale...

Cmq il tuo metodo CopyBitmap fa una 3a copia della bitmap, il mio codice faceva già la copia del rettangolo selezionato, bastava solo impostare quella bitmap come sorgente del pictureBox2.

Cmq l'overload di FromImage mi mancava..sinceramente non ci ho neanche pensato, penso sia una soluzione migliore della mia ..

Ciao!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5