次の方法で共有


Konverter dine farvebilleder til sort-hvid med C#

Jeg var nede hos en foto handler idag med min USB nøgle. Nøglen var fyldt med farvebilleder og jeg skulle have dem fremkaldt fordi jeg er igang med at lave en stor fotovæg derhjemme.

Da jeg bad om at få fremkaldt mine billeder til sort-hvid sagde ekspedienten at dette slet ikke kunne lade sig gøre, og han mente yderliger, at ingen i København ville tilbyde den mulighed.

Straks så jeg for mig, at jeg skulle sidde i IrfanView resten af dagen for at konverter mine billeder fra farve til sort-hvid. "Hell no, det gør jeg simpelthen ikke".

Hjem i sofaen som jeg forresten har siddet i hele ugen da jeg har ødelagt mit højre knæ. Jeg fik fyret op i Visual Studio og tænkte "Det kan gøres hurtigere med kode".

Det her var hvad det blev til:

Download C# koden.
Download VB koden.

C#

    1:  using System;
    2:  using System.Linq;
    3:  using System.IO;
    4:  using System.Drawing;
    5:   
    6:  namespace DanielFrost.GDILibrary
    7:  {
    8:      class Program
    9:      {
   10:          const string dirPath = @"C:\Billeder\Store billeder";
   11:          const string savePath = @"C:\Billeder\Store billeder\Blackwhite\";
   12:   
   13:          static void Main( string[] args )
   14:          {
   15:              DirectoryInfo directory = new DirectoryInfo( dirPath );
   16:   
   17:              var query = from files in directory.GetFiles()
   18:                          select files;
   19:   
   20:              ConvertImagesToGrayScale( query.ToArray() );
   21:          }
   22:   
   23:          static void ConvertImagesToGrayScale(FileInfo[] files)
   24:          {
   25:              foreach( FileInfo file in files ) {
   26:                  Bitmap bitmap = new Bitmap( file.FullName );
   27:   
   28:                  int green = 0;
   29:                  int red = 0;
   30:                  int blue = 0;
   31:                  int newColor = 0;
   32:                  Color color = new Color();
   33:   
   34:                  for( int i = 0; i < bitmap.Height; i++ ) {
   35:                      for( int x = 0; x < bitmap.Width; x++ ) {
   36:                          color = bitmap.GetPixel( x, i );
   37:                          red = (int)( color.R * 0.3 );
   38:                          blue = (int)( color.G * 0.59 );
   39:                          green = (int)( color.B * 0.11 );
   40:   
   41:                          newColor = red + blue + green;
   42:   
   43:                          bitmap.SetPixel( x, i, Color.FromArgb( newColor, newColor, newColor ) );
   44:                      }
   45:                  }
   46:   
   47:                  bitmap.Save( String.Concat(savePath, file.Name) );
   48:                  bitmap.Dispose();
   49:              }
   50:          }
   51:      }
   52:  }

VB:

    1:  Imports Microsoft.VisualBasic
    2:  Imports System
    3:  Imports System.Linq
    4:  Imports System.IO
    5:  Imports System.Drawing
    6:   
    7:  Namespace DanielFrost.GDILibrary
    8:      Friend Class Program
    9:          Private Const dirPath As String = "C:\Users\danielmf\Desktop\Store billeder"
   10:          Private Const savePath As String = "C:\Users\danielmf\Desktop\Store billeder\Blackwhite\"
   11:   
   12:          Shared Sub Main(ByVal args() As String)
   13:              Dim directory As New DirectoryInfo(dirPath)
   14:   
   15:              Dim query = From files In directory.GetFiles() _
   16:                          Select files
   17:   
   18:              ConvertImagesToGrayScale(query.ToArray())
   19:          End Sub
   20:   
   21:          Private Shared Sub ConvertImagesToGrayScale(ByVal files() As FileInfo)
   22:              For Each file As FileInfo In files
   23:                  Dim bitmap As New Bitmap(file.FullName)
   24:   
   25:                  Dim green As Integer = 0
   26:                  Dim red As Integer = 0
   27:                  Dim blue As Integer = 0
   28:                  Dim newColor As Integer = 0
   29:                  Dim color As New Color()
   30:   
   31:                  For i As Integer = 0 To bitmap.Height - 1
   32:                      For x As Integer = 0 To bitmap.Width - 1
   33:                          color = bitmap.GetPixel(x, i)
   34:                          red = CInt(Fix(color.R * 0.3))
   35:                          blue = CInt(Fix(color.G * 0.59))
   36:                          green = CInt(Fix(color.B * 0.11))
   37:   
   38:                          newColor = red + blue + green
   39:   
   40:                          bitmap.SetPixel(x, i, Color.FromArgb(newColor, newColor, newColor))
   41:                      Next x
   42:                  Next i
   43:   
   44:                  bitmap.Save(String.Concat(savePath, file.Name))
   45:                  bitmap.Dispose()
   46:              Next file
   47:          End Sub
   48:      End Class
   49:  End Namespace

Så nu har jeg mulighed for at konverter mine billeder fra farve til sort-hvid. Måske skulle jeg sælge det her kode til samtlige foto butikker i landet :)

Comments

  • Anonymous
    July 12, 2008
    PingBack from http://blog.a-foton.ru/2008/07/konverter-dine-farvebilleder-til-sort-hvid-med-c/

  • Anonymous
    July 12, 2008
    Hehe, hvor ringe. Neeej du ville nok få flere penge, hvis du havde et program som kunne gøre det den anden vej :)

  • Anonymous
    July 13, 2008
    To små observationer: 1) brug using på dit bitmap så du også får kaldt Dispose() i tilfælde af fejl. 2) ville x og y ikke være mere oplagte navne end i og x? :)

  • Anonymous
    July 14, 2008
    Ved større datamængder ville det nok være en idé at bruge unsafe kode fremfor GetPixel og SetPixel, det kan godt være en performancedræber. Derudover ser jeg din kode fejle stort hvis der har sneget sig en fil i mappen der ikke er et billede f.eks. hvis man har browset filerne med et billedvisningsprogram der genererer en index fil af en slags.

  • Anonymous
    July 14, 2008
    ja, det er en performance dræber, men til husbehov overlever man :) Jeg tjekker ikke på om filerne er billeder eller ej, det havde jeg ikke brug for da der kun ligger billeder i den mapper jeg køre igennem. It's just a demo!

  • Anonymous
    July 14, 2008
    Selvfølgelig er det kun en demo, men det kunne jo være der var folk der fandt koden og ville bruge den. Så er det rart med nogle hints til performanceoptimering og fejlhåndtering ;-)

  • Anonymous
    July 15, 2008
    Ikke at det har noget som helst med dit program at gøre, men du er klar over at IrfanView kan lave batch-konverting til s/h ikke? :)

  • Anonymous
    July 15, 2008
    'amen Brian, du skal da også ødelægge den gode stemning :0) Det vidste jeg faktisk ikke, men det andet er også sjovere :)

  • Anonymous
    July 15, 2008
    Sorry, men du kan da glæde dig over, at du får mange kommentarer på dit indlæg :)