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