Feedback

C# - Bitmap schneller in Graustufen wandeln

Veröffentlicht von am 27.09.2009
(2 Bewertungen)
Diese Funktion wandelt ein Bitmap in Graustufen um.
Allerdings schneller als http://dotnet-snippets.de/dns/bitmap-in-graustufen--wandeln-SID70.aspx


danke an herbivore
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

private Bitmap BildSW(Bitmap bmp)
{
    int numBytes = bmpData.Stride * bmp.Height;
    byte[] rgbValues = new byte[numBytes];
    int tmpSW;
    
    PixelFormat pxf = PixelFormat.Format24bppRgb;
	
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);
	
    IntPtr ptr = bmpData.Scan0;
	
    Marshal.Copy(ptr, rgbValues, 0, numBytes);
	
    for(int counter = 0; counter < rgbValues.Length; counter+=3)
    {
        tmpSW  = rgbValues[counter];
        tmpSW += rgbValues[counter+1];
        tmpSW += rgbValues[counter+2];
        
    	tmpSW /= 3;
    	
    	rgbValues[counter] = rgbValues[counter+1] = rgbValues[counter+2] = Convert.ToByte(tmpSW);
    }
    
    Marshal.Copy(rgbValues, 0, ptr, numBytes);
	
    bmp.UnlockBits(bmpData);

    return bmp;
}

2 Kommentare zum Snippet

Timo Boehme schrieb am 10.06.2010:
Das müsste noch schneller gehen mit der ColorMatrix von DotNet.
FinrodEledhwen schrieb am 26.03.2012:
Fehler beim bmpData Zeil 1 in Methode

public static Bitmap BildSW(Bitmap bmp)
{
int tmpSW;

PixelFormat pxf = PixelFormat.Format24bppRgb;

Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);

int numBytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[numBytes];

IntPtr ptr = bmpData.Scan0;

Marshal.Copy(ptr, rgbValues, 0, numBytes);

for (int counter = 0; counter < rgbValues.Length; counter += 3)
{
tmpSW = rgbValues[counter];
tmpSW += rgbValues[counter + 1];
tmpSW += rgbValues[counter + 2];

tmpSW /= 3;

rgbValues[counter] = rgbValues[counter + 1] = rgbValues[counter + 2] = Convert.ToByte(tmpSW);
}

Marshal.Copy(rgbValues, 0, ptr, numBytes);

bmp.UnlockBits(bmpData);

return bmp;
}
 

Logge dich ein, um hier zu kommentieren!