Konverter dine farvebilleder til sort-hvid med C#

Published 12 July 08 02:13 PM

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

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# a-foton &raquo; Konverter dine farvebilleder til sort-hvid med C# said on July 12, 2008 9:28 AM:

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

# Jesper Blad Jensen said on July 12, 2008 3:36 PM:

Hehe, hvor ringe.

Neeej du ville nok få flere penge, hvis du havde et program som kunne gøre det den anden vej :)

# Brian Rasmussen said on July 14, 2008 2:18 AM:

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? :)

# jta said on July 14, 2008 12:22 PM:

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.

# danielmf said on July 15, 2008 4:30 AM:

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!

# jta said on July 15, 2008 5:22 AM:

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

# Brian Rasmussen said on July 16, 2008 2:42 AM:

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? :)

# danielmf said on July 16, 2008 7:08 AM:

'amen Brian, du skal da også ødelægge den gode stemning :0)

Det vidste jeg faktisk ikke, men det andet er også sjovere :)

# Brian Rasmussen said on July 16, 2008 7:49 AM:

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

Leave a Comment

(required) 
(optional)
(required) 

  
Enter Code Here: Required

This Blog

Syndication

Page view tracker