In questo esempio di codice nel linguaggio di programmazione C#, vediamo come creare una nuova immagine con effetto Puzzle, trasformando un’immagine a colori esistenti.
In un progetto di tipo “Windows Application”, nell’evento click di un pulsane, richiamiamo una funzione che applicherà ad una nuova immagine l’effetto puzzle.
Il risultato dell’effetto puzzle è come nella figura precedente.
Dopo aver aggiunto lo spazio dei nomi “System.Drawing”, aggiungiamo la seguente funzione nella form.
C#
public static Bitmap CreaImmaginePuzzle(Bitmap sourceImage, int righe, int colonne)
{
//Verifica che l'immagine sorgente sia valida
if (sourceImage
== null || righe <= 0 || colonne
<= 0)
{
return null;
}
int pieceWidth = sourceImage.Width / colonne;
int pieceHeight = sourceImage.Height / righe;
// Crea una nuova bitmap per
contenere l'immagine del puzzle
Bitmap puzzleBitmap = new Bitmap(sourceImage.Width, sourceImage.Height,
sourceImage.PixelFormat);
using (Graphics graphics = Graphics.FromImage(puzzleBitmap))
{
//Eventualmente imposatre lo sfondo (bianco)
// graphics.Clear(Color.White);
// Mescola le posizioni dei pezzi
Random rand = new Random();
Point[] piecePositions = new Point[righe * colonne];
for (int r = 0; r
< righe; r++)
{
for (int c = 0; c < colonne; c++)
{
piecePositions[r * colonne + c] = new Point(c * pieceWidth, r *
pieceHeight);
}
}
// Shuffle le posizioni
for (int i =
piecePositions.Length - 1; i > 0; i--)
{
int j = rand.Next(i + 1);
Point temp = piecePositions[i];
piecePositions[i] = piecePositions[j];
piecePositions[j] = temp;
}
// Estrai e disegna i pezzi nelle posizioni mescolate
int posizioneCorrente = 0;
for (int r = 0; r
< righe; r++)
{
for (int c = 0; c < colonne; c++)
{
//Definisce il rettangolo del pezzo nell'immagine
sorgente
Rectangle sourceRect = new Rectangle(c * pieceWidth, r * pieceHeight, pieceWidth, pieceHeight);
//Ottiene il pezzo sorgente
Bitmap piece =
sourceImage.Clone(sourceRect, sourceImage.PixelFormat);
//Disegna
il pezzo nella posizione mescolata sulla nuova bitmap
graphics.DrawImage(piece,
piecePositions[posizioneCorrente++]);
piece.Dispose();
// Libera la memoria
del pezzo
}
}
}
return puzzleBitmap;
}
Nell’evento click di un pulsante, richiamo la funzione precedentemente creata, e salviamo l’immagine in un determinato percorso.
Di seguito il frammento di codice delle suddette operazioni.
C#
private void
BtnEffettoPuzzle_Click(object sender, EventArgs e)
{
string immagineOriginale = "C:\\varie\\faro.jpg";
string immagineNuovaPizzle = "C:\\varie\\faroPuzzle.jpg";
Bitmap originalBitmap = new Bitmap(immagineOriginale);
int
puzzleRighe = 5;
int
puzzleColonne = 5;
Bitmap puzzleEffectImage = CreaImmaginePuzzle(originalBitmap, puzzleRighe,
puzzleColonne);
//Salva una nuova immagine con effetto Puzzle
puzzleEffectImage?.Save(immagineNuovaPizzle,
ImageFormat.Jpeg);
originalBitmap.Dispose(); // Libera la memoria dell'immagine
originale
puzzleEffectImage?.Dispose(); // Libera la memoria dell'immagine
con effetto puzzle
}

Nessun commento:
Posta un commento