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) - Komplett 

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

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!