using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Drawing.Drawing2D; namespace SuperTiff { class Program { static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: SuperTiff \n\n"); return; } // Load the bitmap from first argument filename Bitmap bmIn = new Bitmap(args[0]); // Create a new bitmap from the first, scaling down as we go Bitmap bmOut = new Bitmap(bmIn, new Size(bmIn.Width/2, bmIn.Height/2)); // Create an parameter set that we use to save the file EncoderParameters encParams = new EncoderParameters(3); // Set some parameters encParams.Param[0] = new EncoderParameter(Encoder.ColorDepth, 24L); encParams.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone); encParams.Param[2] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame); // Convert the pixels from colour to grayscale (note this is *NOT* changing the colour depth) Bitmap bmOut2 = ToGrayscale(bmOut); // Save bitmap to second argument filename bmOut2.Save(args[1], GetEncoder(ImageFormat.Tiff), encParams); } /// /// Convert bitmap to greyscale /// /// /// private static Bitmap ToGrayscale(Bitmap bmIn) { Bitmap bmOut = new Bitmap(bmIn.Width, bmIn.Height, PixelFormat.Format24bppRgb); for (int x = 0; x < bmIn.Width; x++) { for (int y = 0; y < bmIn.Height; y++) { Color px = bmIn.GetPixel(x, y); int luminance = (int)((0.3f * px.R) + (0.59 * px.G) + (0.11 * px.B)); bmOut.SetPixel(x, y, Color.FromArgb(luminance, luminance, luminance)); } } return bmOut; } /// /// Get the codec for a specific format /// /// /// private static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; } } }