public enum ColorChannelRGBA { R, G, B, A } public enum CompressionLevel : long { /// <summary> /// Specifies the LZW compression scheme. /// </summary> CompressionLZW = 2, /// <summary> /// Specifies the CCITT3 compression scheme. /// </summary> CompressionCCITT3 = 3, /// <summary> /// Specifies the CCITT4 compression scheme. /// </summary> CompressionCCITT4 = 4, /// <summary> /// Specifies the RLE compression scheme. /// </summary> CompressionRle = 5, /// <summary> /// Specifies no compression. /// </summary> CompressionNone = 6, } public enum ImagePosition { } public static class DrawingExtensions { public static ColorMatrix DefaultColorMatrix { //return new ColorMatrix(new float[][] //{ // new float[] { 1f, 0, 0, 0, 0 }, // new float[] { 0, 1f, 0, 0, 0 }, // new float[] { 0, 0, 1f, 0, 0 }, // new float[] { 0, 0, 0, 1f, 0 }, // new float[] { 0, 0, 0, 0, 1f } //}); get { return new ColorMatrix(new float[][] { new float[] { 1, 0, 0, 0, 0 }, new float[] { 0, 1, 0, 0, 0 }, new float[] { 0, 0, 1, 0, 0 }, new float[] { 0, 0, 0, 1, 0 }, new float[] { 0, 0, 0, 0, 1 } }); } } #region ColorMatrix public static ColorMatrix Reset(this ColorMatrix obj) { return new ColorMatrix(new float[][] { new float[] { 1, 0, 0, 0, 0 }, new float[] { 0, 1, 0, 0, 0 }, new float[] { 0, 0, 1, 0, 0 }, new float[] { 0, 0, 0, 1, 0 }, new float[] { 0, 0, 0, 0, 1 } }); } public static float[][] ToArray(this ColorMatrix obj) { float[][] colorMatrixElements = { new float[] {obj[0,0], obj[0,1], obj[0,2], obj[0,3], obj[0,4]}, new float[] {obj[1,0], obj[1,1], obj[1,2], obj[1,3], obj[1,4]}, new float[] {obj[2,0], obj[2,1], obj[2,2], obj[2,3], obj[2,4]}, new float[] {obj[3,0], obj[3,1], obj[3,2], obj[3,3], obj[3,4]}, new float[] {obj[4,0], obj[4,1], obj[4,2], obj[4,3], obj[4,4]} }; return colorMatrixElements; } public static float[] GetMatrixRow(this ColorMatrix obj, int rowindex) { if (!rowindex.Between(0, 4)) throw new ArgumentOutOfRangeException("rowindex", "rowindex must be between 0 and 4"); float[] rtnflarr = new float[5]; for (int i = 0; i < 5; i++) rtnflarr[i] = obj[rowindex, i]; return rtnflarr; } public static ColorMatrix SetMatrixRow(this ColorMatrix obj, int rowindex, params float[] columns) { if (!rowindex.Between(0, 4)) throw new ArgumentOutOfRangeException("rowindex", "rowindex must be between 0 and 4"); if (!columns.Length.Between(1, 5)) throw new ArgumentOutOfRangeException("row", "row array must an length between 1 and 5"); float[][] tmparr = obj.ToArray(); tmparr[rowindex] = columns; return new ColorMatrix(tmparr); } public static ColorMatrix SetMatrixValue(this ColorMatrix obj, int rowindex, int columnindex, float value) { if (!rowindex.Between(0, 4)) throw new ArgumentOutOfRangeException("rowindex", "rowindex must be between 0 and 4"); if (!columnindex.Between(0, 4)) throw new ArgumentOutOfRangeException("columnindex", "columnindex must an between 0 and 4"); obj[rowindex, columnindex] = value; return obj; } public static ColorMatrix MakeBrightnessMatrix(this ColorMatrix obj, float value) { // return obj.ScaleColor(value, value, value); return new ColorMatrix(new float[][] { new float[] { 1f, 0, 0, 0, 0 }, new float[] { 0, 1f, 0, 0, 0 }, new float[] { 0, 0, 1f, 0, 0 }, new float[] { 0, 0, 0, 1f, 0 }, new float[] { value, value, value, 0, 1f } }); } public static ColorMatrix MakeContrastMatrix(this ColorMatrix obj, float value) { //return obj.Reset().SetMatrixValue(0, 0, value).SetMatrixValue(1, 1, value).SetMatrixValue(2, 2, value); return new ColorMatrix(new float[][] { new float[] { value, 0, 0, 0, 0 }, new float[] { 0, value, 0, 0, 0 }, new float[] { 0, 0, value, 0, 0 }, new float[] { 0, 0, 0, 1f, 0 }, new float[] { 0, 0, 0, 0, 1f } }); } public static ColorMatrix MakeTintMatrix(this ColorMatrix obj, float value) { //return obj.SetMatrixRow(3, ((float)value / 100f), ((float)value / 100f), ((float)value / 100f), 1f, 0f); return new ColorMatrix(new float[][] { new float[] { 1f, 0, 0, 0, 0 }, new float[] { 0, 1f, 0, 0, 0 }, new float[] { 0, 0, 1f, 0, 0 }, new float[] { ((float)value / 100f), ((float)value / 100f), ((float)value / 100f), 1f, 0 }, new float[] { 0, 0, 0, 0, 1f } }); } public static ColorMatrix MakeInvertColorMatrix(this ColorMatrix obj) { //return obj.Reset().SetMatrixValue(0, 0, -1).SetMatrixValue(1, 1, -1).SetMatrixValue(2, 2, -1); return new ColorMatrix(new float[][] { new float[] { -1f, 0, 0, 0, 0 }, new float[] { 0, -1f, 0, 0, 0 }, new float[] { 0, 0, -1f, 0, 0 }, new float[] { 0, 0, 0, 1f, 0 }, new float[] { 0, 0, 0, 0, 1f } }); } public static ColorMatrix MakeColorMatrix(this ColorMatrix obj) { //{ 1f, 0f, 0f }, { 0.5f, 1.0f, 0.5f }, { 0.2f, 0.4f, 0.6f } return new ColorMatrix(new float[][] { new float[] { 1f, 0, 0, 0, 0 }, new float[] { 0.5f, 1f, 0.5f, 0, 0 }, new float[] { 0.2f, 0.4f, 0.6f, 0, 0 }, new float[] { 0, 0, 0, 1, 0 }, new float[] { 0, 0, 0, 0, 1 } }); } public static ColorMatrix ScaleColor(this ColorMatrix obj, int Red, int Green, int Blue) { if (!Red.Between(-100, 100)) throw new ArgumentOutOfRangeException("Red", "Red must be between -100 and 100 percent"); if (!Green.Between(-100, 100)) throw new ArgumentOutOfRangeException("Green", "Green must be between -100 and 100 percent"); if (!Blue.Between(-100, 100)) throw new ArgumentOutOfRangeException("Blue", "Blue must be between -100 and 100 percent"); obj.Matrix40 = ((float)Red / 20f); obj.Matrix41 = ((float)Green / 20f); obj.Matrix42 = ((float)Blue / 20f); return obj; } public static ColorMatrix ScaleColor(this ColorMatrix obj, float Red, float Green, float Blue) { if (!Red.Between(-5, 5)) throw new ArgumentOutOfRangeException("Red", "Red must be between -5 and 5 percent"); if (!Green.Between(-5, 5)) throw new ArgumentOutOfRangeException("Green", "Green must be between -5 and 5 percent"); if (!Blue.Between(-5, 5)) throw new ArgumentOutOfRangeException("Blue", "Blue must be between -5 and 5 percent"); obj.Matrix40 = Red; obj.Matrix41 = Green; obj.Matrix42 = Blue; return obj; } public static ColorMatrix ScaleColor(this ColorMatrix obj, int Percent) { if (!Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("Percent", "Percent must be between -100 and 100"); return obj.ScaleColor(Percent, Percent, Percent); } public static ColorMatrix Multiply(this ColorMatrix obj, ColorMatrix multiplier) { return obj.Multiply(multiplier.ToArray()); } public static ColorMatrix Multiply(this ColorMatrix obj, float[][] multiplier) { ColorMatrix rtnmatrix = new ColorMatrix(); float[] matrixcolumn = new float[5]; for (int j = 0; j < 5; j++) { for (int x = 0; x < 5; x++) matrixcolumn[x] = obj[x, j]; for (int y = 0; y < 5; y++) { float s = 0; for (int x = 0; x < 5; x++) s += multiplier[y][x] * matrixcolumn[x]; rtnmatrix[y, j] = s; } } return rtnmatrix; } public static ColorMatrix Rotate(this ColorMatrix obj, float degrees) { double r = degrees * System.Math.PI / 180; // degrees to radians //ColorMatrix rtnmatrix = obj.SetMatrixRow(0, new float[] { (float)System.Math.Cos(r), (float)System.Math.Sin(r), 0, 0, 0 }); //rtnmatrix = rtnmatrix.SetMatrixRow(1, new float[] { (float)-System.Math.Sin(r), (float)-System.Math.Cos(r), 0, 0, 0 }); //ColorMatrix rtnmatrix = obj.SetMatrixRow(0, new float[] { (float)Math.Cos(r), (float)Math.Sin(r), 0, 0, 0 }); //rtnmatrix = rtnmatrix.SetMatrixRow(1, new float[] { (float)-Math.Sin(r), (float)-Math.Cos(r), 0, 0, 0 }); //rtnmatrix = rtnmatrix.SetMatrixRow(2, new float[] { 0, 0, 2, 0, 0 }); float[][] colorMatrixElements = { new float[] {(float)System.Math.Cos(r), (float)System.Math.Sin(r), 0, 0, 0}, new float[] {(float)-System.Math.Sin(r), (float)System.Math.Cos(r), 0, 0, 0}, new float[] {0, 0, 2, 0, 0}, new float[] {0, 0, 0, 1, 0}, new float[] {0, 0, 0, 0, 1} //obj.GetMatrixRow(2), //obj.GetMatrixRow(3), //obj.GetMatrixRow(4) }; return new ColorMatrix(colorMatrixElements); //return rtnmatrix; } public static ColorMatrix Rotate(this ColorMatrix obj, float degrees, ColorChannelRGBA channel) { double rad = degrees * (Math.PI / 180d); int x = 0; int y = 0; switch (channel) { case ColorChannelRGBA.R: y = 2; x = 1; break; case ColorChannelRGBA.G: y = 0; x = 2; break; case ColorChannelRGBA.B: y = 1; x = 0; break; case ColorChannelRGBA.A: y = 0; x = 0; break; default: y = 0; x = 0; break; } float[][] farray = DrawingExtensions.DefaultColorMatrix.ToArray(); farray[x][x] = farray[y][y] = (float)Math.Cos(rad); float s = (float)Math.Sin(rad); //if (channel == ColorChannelRGBA.G) //{ farray[y][x] = s; farray[x][y] = -s; //} //else //{ // farray[y][x] = -s; // farray[x][y] = s; //} //Multiply(m, order); return obj.Multiply(farray); } #endregion #region Image #region Help Methods NOT EXTENSIONS and not public private static Image CombineFrames(Image firstpage, Bitmap[] pages, EncoderParameters ep) { Bitmap Tiff = null; MemoryStream ms = new MemoryStream(); foreach (Bitmap page in pages) { if (Tiff == null) { if (firstpage != null) { Tiff = new Bitmap(firstpage); Tiff.Save(ms, ImageFormat.Tiff.GetImageCodecInfo(), ep); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); Tiff.SaveAdd(page, ep); } else { Tiff = new Bitmap(page); Tiff.Save(ms, ImageFormat.Tiff.GetImageCodecInfo(), ep); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); } } else Tiff.SaveAdd(page, ep); } ms.Flush(); Image rtnimg = Image.FromStream(ms); ms.Close(); return rtnimg; } private static void CombineFrames(Image firstpage, Bitmap[] pages, EncoderParameters ep, string filename) { Bitmap Tiff = null; FileStream ms = new FileStream(filename, FileMode.Create); foreach (Bitmap page in pages) { if (Tiff == null) { if (firstpage != null) { Tiff = new Bitmap(firstpage); Tiff.Save(ms, ImageFormat.Tiff.GetImageCodecInfo(), ep); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); Tiff.SaveAdd(page, ep); } else { Tiff = new Bitmap(page); Tiff.Save(ms, ImageFormat.Tiff.GetImageCodecInfo(), ep); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); } } else Tiff.SaveAdd(page, ep); } ms.Flush(); ms.Close(); } #endregion #region Help Methods NOT EXTENSIONS and public public static void FixGenericGDIplusError(ref Image img) { Bitmap bmp = new Bitmap(img.Width, img.Height); bmp.MakeTransparent(); Graphics g = Graphics.FromImage(bmp); g.DrawImage(img, bmp.GetRectangle(), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel); img.Dispose(); img = bmp; } #endregion public static Image AddFrames(this Image obj, Bitmap[] pages) { EncoderParameters ep = new EncoderParameters(1); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); return CombineFrames(obj, pages, ep); } public static Image AddFrames(this Image obj, Bitmap[] pages, CompressionLevel compress) { EncoderParameters ep = new EncoderParameters(2); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); ep.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW); return CombineFrames(obj, pages, ep); } public static Image AddFrames(this Image obj, Bitmap[] pages, CompressionLevel compress, ColorDepth ColorDepth) { EncoderParameters ep = new EncoderParameters(3); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); ep.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)compress); ep.Param[2] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, (long)ColorDepth); return CombineFrames(obj, pages, ep); } public static Image Brightness(this Image obj, int Percent) { if (!Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("Percent", "Percent must be between -100 and 100"); return obj.SetColorMatrix(DefaultColorMatrix.MakeBrightnessMatrix((float)Percent / 100f)); } public static Image Compress(this Image obj, ImageFormat format, int quality) { if (quality < 0 || quality > 100) throw new ArgumentOutOfRangeException("quality must be between 0 and 100."); MemoryStream ms = new MemoryStream(); EncoderParameters ep = new EncoderParameters(1); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality); obj.Save(ms, format.GetImageCodecInfo(), ep); ms.Flush(); return Image.FromStream(ms); } public static Image Contrast(this Image obj, int Percent) { if (!Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("Percent", "Percent must be between -100 and 100"); return obj.SetColorMatrix(DefaultColorMatrix.MakeContrastMatrix((float)Percent / 100f)); } public static Image Crop(this Image obj, Rectangle cropArea) { try { Bitmap bmpImage = new Bitmap(obj); Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); return (Image)(bmpCrop); } catch { throw; } } public static Image DrawString(this Image obj, string text, Font font, Brush brush, ContentAlignment textAlign, TextRenderingHint textRender) { Bitmap myBitmap = new Bitmap(obj); using (Graphics grObj = Graphics.FromImage(myBitmap)) { grObj.TextRenderingHint = textRender; StringFormat strFormat = new StringFormat(); #region Alignment Switch switch (textAlign) { case ContentAlignment.BottomCenter: { strFormat.Alignment = StringAlignment.Center; strFormat.LineAlignment = StringAlignment.Far; break; } case ContentAlignment.BottomLeft: { strFormat.Alignment = StringAlignment.Near; strFormat.LineAlignment = StringAlignment.Far; break; } case ContentAlignment.BottomRight: { strFormat.Alignment = StringAlignment.Far; strFormat.LineAlignment = StringAlignment.Far; break; } case ContentAlignment.MiddleCenter: { strFormat.Alignment = StringAlignment.Center; strFormat.LineAlignment = StringAlignment.Center; break; } case ContentAlignment.MiddleLeft: { strFormat.Alignment = StringAlignment.Near; strFormat.LineAlignment = StringAlignment.Center; break; } case ContentAlignment.MiddleRight: { strFormat.Alignment = StringAlignment.Far; strFormat.LineAlignment = StringAlignment.Center; break; } case ContentAlignment.TopCenter: { strFormat.Alignment = StringAlignment.Center; strFormat.LineAlignment = StringAlignment.Near; break; } case ContentAlignment.TopLeft: { strFormat.Alignment = StringAlignment.Near; strFormat.LineAlignment = StringAlignment.Near; break; } case ContentAlignment.TopRight: { strFormat.Alignment = StringAlignment.Far; strFormat.LineAlignment = StringAlignment.Near; break; } default: { strFormat.Alignment = StringAlignment.Near; strFormat.LineAlignment = StringAlignment.Near; break; } } #endregion grObj.DrawString(text, font, brush, new RectangleF(0, 0, obj.Width, obj.Height), strFormat); } return (Image)myBitmap; } public static Image DrawString(this Image obj, string text, Font font, Brush brush, ContentAlignment textAlign) { return obj.DrawString(text, font, brush, textAlign, TextRenderingHint.SystemDefault); } public static Image DrawString(this Image obj, string text, ContentAlignment textAlign) { return obj.DrawString(text, SystemFonts.DefaultFont, Brushes.Black, textAlign); } public static Image[] GetFrames(this Image obj, ImageFormat format) { try { if (obj.RawFormat.Equals(ImageFormat.Tiff) || obj.RawFormat.Equals(ImageFormat.Gif)) { List<Image> rtnarr = new List<Image>(); FrameDimension fd = new FrameDimension(obj.FrameDimensionsList[0]); for (int i = 0; i < obj.GetFrameCount(fd); i++) { obj.SelectActiveFrame(fd, i); using (MemoryStream byteStream = new MemoryStream()) { obj.Save(byteStream, format); rtnarr.Add(Image.FromStream(byteStream)); } } return rtnarr.ToArray(); } else return new Image[] { obj }; } catch { return new Image[] { obj }; } } public static Rectangle GetRectangle(this Image obj) { return new Rectangle(0, 0, obj.Width, obj.Height); } public static Rectangle GetRectangleTilt(this Image obj) { return new Rectangle(0, 0, obj.Height, obj.Width); } public static Image GrayScale(this Image obj) { ColorMatrix colorMatrix = new ColorMatrix(new float[][] { new float[] {.3f, .3f, .3f, 0, 0}, new float[] {.59f, .59f, .59f, 0, 0}, new float[] {.11f, .11f, .11f, 0, 0}, new float[] {0, 0, 0, 1, 0}, new float[] {0, 0, 0, 0, 1} }); return obj.SetColorMatrix(colorMatrix); } public static Image Invert(this Image obj) { return obj.SetColorMatrix(DefaultColorMatrix.MakeInvertColorMatrix()); } public static Image Merge(this Image obj, Image mergeWith, ContentAlignment alignment) { int xpos, ypos; switch (alignment) { case ContentAlignment.BottomCenter: xpos = (obj.Width - mergeWith.Width) / 2; ypos = (obj.Height - mergeWith.Height); break; case ContentAlignment.BottomLeft: xpos = 0; ypos = (obj.Height - mergeWith.Height); break; case ContentAlignment.BottomRight: xpos = (obj.Width - mergeWith.Width); ypos = (obj.Height - mergeWith.Height); break; case ContentAlignment.MiddleCenter: xpos = (obj.Width - mergeWith.Width) / 2; ypos = (obj.Height - mergeWith.Height) / 2; break; case ContentAlignment.MiddleLeft: xpos = 0; ypos = (obj.Height - mergeWith.Height) / 2; break; case ContentAlignment.MiddleRight: xpos = (obj.Width - mergeWith.Width); ypos = (obj.Height - mergeWith.Height) / 2; break; case ContentAlignment.TopCenter: xpos = (obj.Width - mergeWith.Width) / 2; ypos = 0; break; case ContentAlignment.TopLeft: xpos = 0; ypos = 0; break; case ContentAlignment.TopRight: xpos = (obj.Width - mergeWith.Width); ypos = 0; break; default: xpos = 0; ypos = 0; break; } Bitmap img = new Bitmap(obj); Graphics g = Graphics.FromImage(img); g.DrawImageUnscaled(mergeWith, xpos, ypos); g.Save(); return img; } public static Image MergeToTiff(this Bitmap[] obj) { EncoderParameters ep = new EncoderParameters(1); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); return CombineFrames(null, obj, ep); } public static void MergeToTiff(this Bitmap[] obj, string filename) { EncoderParameters ep = new EncoderParameters(1); ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame); CombineFrames(null, obj, ep, filename); } public static Image Resize(this Image obj, float Percent) { return obj.Resize(Percent, obj.PixelFormat); } public static Image Resize(this Image obj, float Percent, InterpolationMode interpolationMode) { return obj.Resize(Percent, obj.PixelFormat, interpolationMode); } public static Image Resize(this Image obj, float Percent, PixelFormat pixelFormat) { return obj.Resize(Percent, pixelFormat, obj.HorizontalResolution, obj.VerticalResolution); } public static Image Resize(this Image obj, float Percent, PixelFormat pixelFormat, InterpolationMode interpolationMode) { return obj.Resize(Percent, pixelFormat, obj.HorizontalResolution, obj.VerticalResolution, interpolationMode); } public static Image Resize(this Image obj, float Percent, PixelFormat pixelFormat, float horizontalResolution, float verticalResolution) { return obj.Resize(Percent, pixelFormat, horizontalResolution, verticalResolution, InterpolationMode.HighQualityBicubic); } public static Image Resize(this Image obj, float Percent, PixelFormat pixelFormat, float horizontalResolution, float verticalResolution, InterpolationMode interpolationMode) { try { float nPercent = Percent; // ((float)Percent / 100); int destWidth = (int)Math.Round(((float)obj.Width * nPercent)); int destHeight = (int)Math.Round(((float)obj.Height * nPercent)); Bitmap bmObj = new Bitmap(destWidth, destHeight, pixelFormat); bmObj.SetResolution(horizontalResolution, verticalResolution); using (Graphics grObj = Graphics.FromImage(bmObj)) { grObj.Clear(Color.Transparent); grObj.InterpolationMode = interpolationMode; grObj.DrawImage(obj, new Rectangle(0, 0, destWidth, destHeight), new Rectangle(0, 0, obj.Width, obj.Height), GraphicsUnit.Pixel); } return (Image)bmObj; } catch { throw; } } public static Image Resize(this Image obj, int Width, int Height) { return obj.Resize(Width, Height, obj.PixelFormat); } public static Image Resize(this Image obj, int Width, int Height, InterpolationMode interpolationMode) { return obj.Resize(Width, Height, obj.PixelFormat, interpolationMode); } public static Image Resize(this Image obj, int Width, int Height, PixelFormat pixelFormat) { return obj.Resize(Width, Height, pixelFormat, obj.HorizontalResolution, obj.VerticalResolution); } public static Image Resize(this Image obj, int Width, int Height, PixelFormat pixelFormat, InterpolationMode interpolationMode) { return obj.Resize(Width, Height, pixelFormat, obj.HorizontalResolution, obj.VerticalResolution, interpolationMode); } public static Image Resize(this Image obj, int Width, int Height, PixelFormat pixelFormat, float horizontalResolution, float verticalResolution) { return obj.Resize(Width, Height, pixelFormat, horizontalResolution, verticalResolution, InterpolationMode.HighQualityBicubic); } public static Image Resize(this Image obj, int Width, int Height, PixelFormat pixelFormat, float horizontalResolution, float verticalResolution, InterpolationMode interpolationMode) { try { int sourceWidth = obj.Width; int sourceHeight = obj.Height; int destX = 0; int destY = 0; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)Width / (float)sourceWidth); nPercentH = ((float)Height / (float)sourceHeight); if (nPercentH < nPercentW) { nPercent = nPercentH; destX = System.Convert.ToInt16((Width - (sourceWidth * nPercent)) / 2); } else { nPercent = nPercentW; destY = System.Convert.ToInt16((Height - (sourceHeight * nPercent)) / 2); } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmObj = new Bitmap(Width, Height, pixelFormat); bmObj.SetResolution(horizontalResolution, verticalResolution); using (Graphics grObj = Graphics.FromImage(bmObj)) { grObj.Clear(Color.Transparent); grObj.InterpolationMode = interpolationMode; grObj.DrawImage(obj, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(0, 0, sourceWidth, sourceHeight), GraphicsUnit.Pixel); } return (Image)bmObj; } catch { throw; } } public static Image Resize(this Image obj, int Size, bool KeepAspectRatio) { if (KeepAspectRatio) { if (obj.Width >= obj.Height) return obj.Resize(((float)Size / (float)obj.Width)); else return obj.Resize(((float)Size / (float)obj.Height)); } else return obj.Resize(Size, Size); } public static Image Resize(this Image obj, int Size, bool KeepAspectRatio, InterpolationMode interpolationMode) { if (KeepAspectRatio) { if (obj.Width >= obj.Height) return obj.Resize(((float)Size / (float)obj.Width), interpolationMode); else return obj.Resize(((float)Size / (float)obj.Height), interpolationMode); } else return obj.Resize(Size, Size, interpolationMode); } public static Image Resize(this Image obj, int Size, bool KeepAspectRatio, PixelFormat pixelFormat, InterpolationMode interpolationMode) { if (KeepAspectRatio) { if (obj.Width >= obj.Height) return obj.Resize(((float)Size / (float)obj.Width), pixelFormat, interpolationMode); else return obj.Resize(((float)Size / (float)obj.Height), pixelFormat, interpolationMode); } else return obj.Resize(Size, Size, pixelFormat, interpolationMode); } public static Image Rotate(this Image obj, int angle) { Bitmap bmObj = new Bitmap(obj.Width, obj.Height); Graphics grObj = Graphics.FromImage(bmObj); grObj.TranslateTransform((float)obj.Width / 2, (float)obj.Height / 2); grObj.RotateTransform(angle); grObj.TranslateTransform(-(float)obj.Width / 2, -(float)obj.Height / 2); grObj.DrawImage(obj, new Point(0, 0)); return bmObj; } public static Image ScaleColor(this Image obj, int R_Percent, int G_Percent, int B_Percent) { if (!R_Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("R_Percent", "R_Percent must be between -100 and 100"); if (!G_Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("G_Percent", "G_Percent must be between -100 and 100"); if (!B_Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("B_Percent", "B_Percent must be between -100 and 100"); return obj.SetColorMatrix(DefaultColorMatrix.ScaleColor(R_Percent, G_Percent, B_Percent)); } public static Image SetColorMatrix(this Image obj, ColorMatrix colormatrix) { return obj.SetColorMatrix(colormatrix, GraphicsUnit.Pixel); } public static Image SetColorMatrix(this Image obj, ColorMatrix colormatrix, GraphicsUnit graphicunit) { try { Bitmap bmObj = new Bitmap(obj.Width, obj.Height); using (Graphics g = Graphics.FromImage(bmObj)) { ImageAttributes attributes = new ImageAttributes(); attributes.SetColorMatrix(colormatrix); g.DrawImage(obj, new Rectangle(0, 0, obj.Width, obj.Height), 0, 0, obj.Width, obj.Height, graphicunit, attributes); } return (Image)bmObj; } catch { throw; } } public static Image ToImage(this byte[] obj) { MemoryStream ms = new MemoryStream(obj); Image returnImage = Image.FromStream(ms); return returnImage; } public static byte[] ToByteArray(this Image obj) { byte[] rtnval = null; using (MemoryStream ms = new MemoryStream()) { Image img = obj.FixGenericGDIplusError(); img.Save(ms, img.RawFormat); rtnval = ms.GetBuffer(); } return rtnval; } public static Stream ToStream(this Image obj) { MemoryStream ms = new MemoryStream(); Image img = obj.FixGenericGDIplusError(); img.Save(ms, img.RawFormat); return ms; } public static Icon ToIcon(this Image obj) { try { Bitmap bmObj = new Bitmap(obj); return Icon.FromHandle(bmObj.GetHicon()); } catch { try { MemoryStream buffer = new MemoryStream(); obj.Save(buffer, ImageFormat.Icon); buffer.Position = 0; return new Icon(buffer); } catch { throw; } } } public static Icon ToIcon(this Image obj, int Size, bool KeepAspectRatio) { return obj.Resize(Size, KeepAspectRatio).ToIcon(); } public static Image Tint(this Image obj, int Percent) { if (!Percent.Between(-100, 100)) throw new ArgumentOutOfRangeException("Percent", "Percent must be between -100 and 100"); return obj.SetColorMatrix(DefaultColorMatrix.MakeTintMatrix((float)Percent)); } public static Image FixGenericGDIplusError(this Image img) { Bitmap bmp = new Bitmap(img.Width, img.Height); bmp.MakeTransparent(); Graphics g = Graphics.FromImage(bmp); g.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel); return bmp; } public static string ToBase64(this Image obj) { return Convert.ToBase64String(obj.ToByteArray()); } public static Image FromBase64(this string obj) { return Convert.FromBase64String(obj).ToImage(); } #endregion #region Font /// <summary> /// Sets the style of the font. /// </summary> /// <param name="obj">The font type to change</param> /// <param name="style">style to apply</param> /// <returns>new font that has the new style applied.</returns> /// <remarks>Developed by Paw Jershauge. Find more Extensions and C# code on: http://pawjershauge.blogspot.com</remarks> public static Font SetStyle(this Font obj, FontStyle style) { return new Font(obj, style); } #endregion public static ImageCodecInfo GetImageCodecInfo(this ImageFormat obj) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) if (codec.FormatID == obj.Guid) return codec; return null; } }
September 20, 2010
Image/Drawing Extensions
Some Image/Drawing Extensions I picked up or created along the way.
Subscribe to:
Post Comments (Atom)
Thank you. This class was very useful to my job.
ReplyDelete