using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using Microsoft.SharePoint;
using System.Net;
using System.Web;
using System.IO;
using System.Security.Principal;
namespace Microsoft.PKS
{
public static class GfxUtils
{
///
/// Allows drawing fonts with borders and auto centers the font on a bitmap.
///
public class PowerFont
{
private Font font;
private Brush tc, oc;
public PowerFont(string fontName, float fontSize, Color textColor, Color outlineColor, string style)
{
if (string.IsNullOrEmpty(fontName)) { fontName = "Arial"; }
if (fontSize <= 0) { fontSize = 10; }
FontStyle fs = FontStyle.Regular;
if (!string.IsNullOrEmpty(style))
{
style = style.ToLower();
if (style.Contains("bold")) { fs |= FontStyle.Bold; }
if (style.Contains("italic")) { fs |= FontStyle.Italic; }
if (style.Contains("strike")) { fs |= FontStyle.Strikeout; }
if (style.Contains("underline")) { fs |= FontStyle.Underline; }
}
font = new Font(fontName, fontSize, fs);
tc = new SolidBrush(textColor);
oc = new SolidBrush(outlineColor);
}
public void WriteText(Bitmap img, string text)
{
Graphics g = Graphics.FromImage(img);
g.PageUnit = GraphicsUnit.Pixel;
SizeF sz = g.MeasureString(text, font, new SizeF(img.Width, img.Height));
float x, y;
x = (img.Width / 2) - (sz.Width / 2);
y = (img.Height / 2) - (sz.Height / 2);
float offset = font.Size / 10;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
RectangleF loc = RectangleF.Empty;
//draw border
for (float ox = -(offset); ox <= offset; ox++)
{
for (float oy = -(offset); oy <= offset; oy++)
{
loc = new RectangleF(x + ox, y + oy, sz.Width, sz.Height);
g.DrawString(text, font, oc, loc, sf);
}
}
loc = new RectangleF(x, y, sz.Width, sz.Height);
//draw text
g.DrawString(text, font, tc, loc, sf);
g.Flush(FlushIntention.Flush);
}
}
///
/// Converts any bitmap (event paletted ones) to 32 bit argb so that we can draw on them.
///
///
///
public static Bitmap ConvertBitmapToArgb(Bitmap bmp)
{
if (bmp.PixelFormat == PixelFormat.Format32bppArgb) { return bmp; }
Bitmap output = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(output);
g.CompositingQuality = CompositingQuality.HighQuality;
g.CompositingMode = CompositingMode.SourceCopy;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PageUnit = GraphicsUnit.Pixel;
g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
g.Flush(FlushIntention.Flush);
return output;
}
///
/// Loads a bitmap given a URI, currently supports file system, asp virtual paths, and http, soon to be added: sharepoint list
///
///
///
///
public static Bitmap LoadBitmap(string location, SPWeb web)
{
if (string.IsNullOrEmpty(location)) { return null; }
try
{
Bitmap bmp = new Bitmap(location);
return ConvertBitmapToArgb(bmp);
}
catch { }
//todo, check if sharepoint can open the image, (ie, pass in an SPWeb (nullable))
if (web != null)
{
}
try
{
Bitmap bmp = new Bitmap(HttpContext.Current.Server.MapPath(location));
return ConvertBitmapToArgb(bmp);
}
catch { }
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(location);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream str = resp.GetResponseStream();
Bitmap bmp = new Bitmap(str);
str.Close();
str.Dispose();
return ConvertBitmapToArgb(bmp);
}
catch (WebException webEx)
{
if (webEx.Status == WebExceptionStatus.ProtocolError)
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(location);
req.Credentials = CredentialCache.DefaultNetworkCredentials;
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream str = resp.GetResponseStream();
Bitmap bmp = new Bitmap(str);
str.Close();
str.Dispose();
return ConvertBitmapToArgb(bmp);
}
catch { }
}
}
catch { }
return null;
}
public static class HighQualityBitmapResizer
{
///
/// Resizes a System.Drawing.Bitmap.
///
/// The bitmap to resize.
/// The target size.
/// The resized bitmap.
public static Bitmap ResizeBitmap(Bitmap input, Size targetSize)
{
return ResizeBitmap(input, targetSize, false, Color.Black);
}
///
/// Resizes a System.Drawing.Bitmap.
///
/// The bitmap to resize.
/// The target size.
/// Should the resize routine allow distortion?
/// The resized bitmap.
public static Bitmap ResizeBitmap(Bitmap input, Size targetSize, bool allowDistortion)
{
return ResizeBitmap(input, targetSize, allowDistortion, Color.Black);
}
///
/// Resizes a System.Drawing.Bitmap.
///
/// The bitmap to resize.
/// The target size.
/// Should the resize routine allow distortion?
/// The color of the bars on to put on the sides when preventing distortion.
/// The resized bitmap.
public static Bitmap ResizeBitmap(Bitmap input, Size targetSize, bool allowDistortion, Color backgroundColor)
{
if (input == null) { throw new ArgumentNullException("input"); }
if (targetSize == Size.Empty || targetSize.Width < 1 || targetSize.Height < 1)
{ throw new ArgumentOutOfRangeException("targetSize", "targetSize must be 1x1 or larger."); }
//if (input.Size == targetSize) { return (Bitmap)input.Clone(); } //recreate the image as a 32 bit argb no matter what.
double sx, sy, cw, ch, nw, nh;
cw = (double)input.Width;
ch = (double)input.Height;
if (allowDistortion)
{
nw = targetSize.Width;
nh = targetSize.Height;
}
else
{
nw = (double)targetSize.Width;
nh = (nw / cw) * ch;
if (nh > targetSize.Height)
{
nh = (double)targetSize.Height;
nw = (nh / ch) * cw;
}
}
Bitmap output = new Bitmap(targetSize.Width, targetSize.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(output);
g.CompositingQuality = CompositingQuality.HighQuality;
g.CompositingMode = CompositingMode.SourceCopy;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PageUnit = GraphicsUnit.Pixel;
g.SmoothingMode = SmoothingMode.HighQuality;
sx = (targetSize.Width / 2) - (nw / 2);
sy = (targetSize.Height / 2) - (nh / 2);
Rectangle rect = new Rectangle((int)sx, (int)sy, (int)nw, (int)nh);
g.Clear(backgroundColor);
g.DrawImage(input, rect);
g.Flush(FlushIntention.Flush);
return output;
}
}
}
}