venerdì 3 ottobre 2025

C# creare una nuova immagine con effetto puzzle da un’immagine esistente a colori, tramite .Net 9 Windows Application

 

C# effetto puzzle


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: