Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C#]scorrere immagine GetPixel LockBits

    Salve a tutti.
    Devo scorrere un'immagine fino a trovarne il primo pixel scuro (diciamo che l'immagine è a sfondo bianco e per scuro intendo grigio/nero).
    L'implementazione che ho utilizzato sfrutta GetPixel che però ho visto essere molto lento.
    Mi sono documentato un po' e ho visto che è molto più veloce utilizzare i puntatori e LockBits.
    Il codice iniziale (quello con GetPixel) è:
    codice:
            int x = 0;
            int y = 0;
            bool trovatoNero = false;
            //cutVersion è un oggetto di tipo Bitmap
    
            while (y < cutVersion.Height && trovatoNero == false)
            {
                x = 0;
                c = cutVersion.GetPixel(x, y);
                while (x < cutVersion.Width && trovatoNero == false)
                {
                    if (c.R <= 100 || c.G <= 100 || c.B <= 100)
                    {
                        trovatoNero = true;
                    }
                    x++;
                }
                y++;
            }
    Ho provato ad adattare il codice utilizzando LockBits ma non ottengo lo stesso risultato.
    (A me interessa sapere a che altezza si trova il pixel scuro)
    Il codice è:
    codice:
           BitmapData bmpData = cutVersion.LockBits(new Rectangle(0, 0, cutVersion.Width, cutVersion.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
            System.IntPtr bmpScan0 = bmpData.Scan0;
            unsafe
            {
                byte* bmpPtr = (byte*)(void*)bmpScan0;
               
                while (y < cutVersion.Height && trovatoNero == false)
                {
                    x = 0;
                    while (x < cutVersion.Width && trovatoNero == false)
                    {
                        byte pixelXY = *(bmpPtr++);
                        if(pixelXY<=100)
                        {
                            trovatoNero = true;
                        }
                        x++;
                    }
                    y++;
                }
                cutVersion.UnlockBits(bmpData);
            }
    Dove sbaglio?

  2. #2
    RISOLTO
    codice:
            int x = 0;
            int y = 0;
            bool trovatoNero = false;
            BitmapData bmpData = cutVersion.LockBits(new Rectangle(0, 0, cutVersion.Width, cutVersion.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
            System.IntPtr bmpScan0 = bmpData.Scan0;
            int PixelSize = 4;
            unsafe
            {
                for (y = 0; y < bmpData.Height && !trovatoNero ; y++)
                {
                    byte* row = (byte*)bmpData.Scan0 + (y * bmpData.Stride);
    
                    for (x = 0; x < bmpData.Width; x++)
                    {
                        if (row[x * PixelSize] <= 100)
                        {
                            trovatoNero = true;
                        }
                    }
                }            
                cutVersion.UnlockBits(bmpData);
            }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.