Avatar billede ahrensberg Nybegynder
16. maj 2007 - 10:33 Der er 3 kommentarer og
1 løsning

Konvertering af farve til sort/hvid

Hej alle

Jeg har skrevet nedenstående kode til konvertering af farve billede til sort/hvid (ikke kun grayscale), men det tager en krig at lave et billede om på 1000x1000, da den jo her foretager mere end 3 mill operationer.

private Bitmap ConvertToBlackWhite(Bitmap source)
{
  Bitmap bm = new Bitmap(source.Width, source.Height);
  for (int y = 0; y < bm.Height; y++)
  {
      for (int x = 0; x < bm.Width; x++)
      {
        Color c = source.GetPixel(x, y);

        int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
        if (luma < 190)
            luma = 0;
          else
            luma = 255;
          bm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
      }
  }
  return bm;
}

Nogen der har et forslag til hvordan den optimeres så det ikke tager så lang tid?
Avatar billede crazysnap Seniormester
16. maj 2007 - 10:47 #1
Hej ahrensberg,

Går det godt! ;)


Så har jeg da lige en hurtigere løsning her som er ca. 1000 gange hurtigere:


public Bitmap GrayScale(Bitmap bmSource)
{
    int Width = bmSource.Width;
    int Height = bmSource.Height;

    //Clone bitmap
    Bitmap bmOutput = bmSource.Clone(new Rectangle(0, 0, Width, Height), System.Drawing.Imaging.PixelFormat.Format32bppRgb);

    // Lock the bitmap bits to memory
    System.Drawing.Imaging.BitmapData destData = bmOutput.LockBits(new Rectangle(0, 0, Width, Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);

    unsafe
    {
        byte* pDest = (byte*)destData.Scan0.ToPointer();

        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)];

                int luma = (int)(r * 0.3 + g * 0.59 + b * 0.11);
                if (luma < 190)
                    luma = 0;
                else
                    luma = 255;


                pDest[((y * Width + x) * 4) + 2] = (byte)luma;  //R
                pDest[((y * Width + x) * 4) + 1] = (byte)luma;  //G
                pDest[((y * Width + x) * 4)] = (byte)luma;    //B

            }
        }
        bmOutput.UnlockBits(destData);
    }

    return bmOutput;
}


Mvh.

- Snap :)
Avatar billede crazysnap Seniormester
16. maj 2007 - 10:58 #2
Og svaret kommer her! :)
Avatar billede ahrensberg Nybegynder
16. maj 2007 - 10:59 #3
Takker du gamle ;) Altid rart med lidt hjælp fra en supernørd :P
Avatar billede crazysnap Seniormester
16. maj 2007 - 11:01 #4
Hehe, SÅ!!


Jeg er vidst ikke SÅ gammel endnu! ;)

Du ved hvor du kan fange mig hvis der opstår problemer med det! :)


Tak for pointene,


Mvh.

- Snap
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester