Du kunne starte med at fjerne unødig kode, og flytte alt det der er fælles for hver pixel ud af loopet.
public Bitmap ChangeColor(Bitmap OrgImg) { Bitmap img1 = new Bitmap(OrgImg); int x, y; Color newColor = Color.FromArgb(255, 255, 255); Color pixelColor; byte b = 4;
// Loop through the OrgImg pixels to change the color. for (x = 0; x < img1.Width; x++) { for (y = 0; y < img1.Height; y++) { pixelColor = img1.GetPixel(x, y); if ((pixelColor.R <= b | (pixelColor.G <= b | (pixelColor.B <= b) { img1.SetPixel(x, y, newColor); } } } return img1; }
Prøv at se om det hjælper lidt. Det skal lige siges at jeg ikke har prøvet at kompile koden, så jeg tør ikke garantere at det virker :)
Grunden til at det går så langsomt er at GetPixel og SetPixel er meget langsomme metoder til entry i bitmaps. Du kan i stedet bruge unsafe code og tilgå pixel- værdierne direkte ved hjælp af pointers. På den måde slipper du for den store overhead af GetPixel og SetPixel. Jeg har lavet et eksempel til dig nedenfor som udfører den handling du ønsker:
public Bitmap ChangeColor(Bitmap bmSource) { int Width = bmSource.Width; int Height = bmSource.Height;
for (int x = 0; x < Width; x++) { for (int y = 0; y < Height; y++) { int r = pDest[((y * Width + x) * 4) + 2]; int g = pDest[((y * Width + x) * 4) + 1]; int b = pDest[((y * Width + x) * 4)];
if (r < (byte)4 || g < (byte)4 || b < (byte)4) r = g = b = 255;
Jeg testede lige hastighedsforskellen mellem den lettere optimerede metode fra bitmatic og min der bruger pointers med et billede på 1280x960:
ChangeColor normal : 46.615 sek. ChangeColor pointers : 0.045 sek.
Så der kan man tydeligt se hvor langsomme GetPixel og SetPixel er. :( Og jeg er faktisk overrasket over de er SÅ langsomme at bruge, troede kun der var en faktor 10 i forskel, men det er jo nærmere en faktor 1000. Så jeg kan godt forstå du brokker dig over hastigheden når du kører metoden på et billede af størrelse 1920x1200. :/
Jeg er ihvertfald glad for at C# supporter pointers via unsafe coding, gør mange små-ting en del nemmere og hurtigere. :)
Men anyways, lige en bemærkning til kewl, husk at checke "Allow unsafe code" i "project properties -> Build" for at kunne få lov til at compile min metode og alt andet unsafe kode. :)
Det var så lidt (og godt at høre det virker), og svaret kommer her! :)
Mvh.
- Snap
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.