左旋
继续旋转
右旋:
继续右旋
效果展示结束:
下面讲讲利用什么来实现的:
由于不光判断是否是图片的*.BMP;*.JPG;*.GIF;*.TIF;*.PNG 还有*.PDF文件,因此写了个自定义控件里面处理左旋,右旋,背景颜色,之类的。这里不来实现PDF
ImageList.cs里面的处理:
private List<PreviewControl> poPreviews = null; public ImageList() { InitializeComponent(); poPreviews = new List<PreviewControl>(); } /// <summary> /// 取得选择的图片 /// </summary> /// <returns></returns> private PreviewControl GetCurrentPreview() { for (int i = 0; i < poPreviews.Count; i++) { if (poPreviews[i].Selected) { return poPreviews[i]; } } return null; } /// <summary> /// 左旋 /// </summary> /// <param name="eventSender"></param> /// <param name="eventArgs"></param> public void cmdLeftRoteImage_Click(System.Object eventSender, System.EventArgs eventArgs) { PreviewControl oCurrent = GetCurrentPreview(); if (oCurrent != null) { oCurrent.RotateLeft(); } } /// <summary> /// 右旋 /// </summary> /// <param name="eventSender"></param> /// <param name="eventArgs"></param> public void cmdRightRoteImage_Click(System.Object eventSender, System.EventArgs eventArgs) { PreviewControl oCurrent = GetCurrentPreview(); if (oCurrent != null) { oCurrent.RotateRight(); } }
PreviewControll.cs 的代码: 自定义控件上面拖放PictureBox 和WebBrowser
[DllImport("user32.dll")] extern static short GetKeyState(int vKey); /// <summary> /// 加载图片 /// </summary> private string psImageLocation = String.Empty; /// <summary> /// 左旋,右旋后直接保存 /// false:不保存、 true:保存 /// </summary> private bool pbRotateSaveFlg = true; /// <summary> /// PDF文件类型的标志 /// TRUE:PDF文件 FALSE:不是PDF文件 /// </summary> private bool pbPdfFlg = false; /// <summary> /// 选择时的颜色 /// </summary> private Color poSelectColor = SystemColors.Highlight; /// <summary> /// 未选择的颜色 /// </summary> private Color poUnSelectColor = SystemColors.Control; /// <summary> /// 图片左旋右旋的值 /// </summary> private int piRoteSum = 0; /// <summary> /// 图片预览控件初始化 /// </summary> public PreviewControl() { InitializeComponent(); } private bool IsControlKeyDown() { return (GetKeyState(0x0011) & 0x0000FF00) != 0; } private bool IsShiftKeyDown() { return (GetKeyState(0x0010) & 0x0000FF00) != 0; } /// <summary> /// 加载的图片 /// </summary> public string ImageLocation { set { psImageLocation = value; if (psImageLocation.Length == 0) { pictureBox1.Visible = false; webBrowser1.Visible = false; } else if (value.EndsWith(".pdf", StringComparison.CurrentCultureIgnoreCase)) { webBrowser1.Visible = true; webBrowser1.Navigate(value); pictureBox2.Tag = value; pictureBox2.Visible = true; pictureBox1.Visible = false; pbPdfFlg = true; } else { webBrowser1.Visible = false; pictureBox1.Visible = true; pictureBox1.ImageLocation = value; } } get { return psImageLocation; } } /// <summary> /// 选择时的颜色 /// </summary> public Color SelectColor { get { return poSelectColor; } set { poSelectColor = value; } } /// <summary> /// 没有选择的颜色 /// </summary> public Color UnSelectColor { get { return poUnSelectColor; } set { poUnSelectColor = value; } } /// <summary> /// 图片旋转的值入 90 180 270 度 /// </summary> public int RotateSum { get { return piRoteSum; } set { piRoteSum = value; } } /// <summary> /// 保存旋转后位置的状态 /// </summary> public bool RotateSaveFlg { set { pbRotateSaveFlg = value; } } /// <summary> /// 左旋 /// </summary> public void RotateLeft() { if (pictureBox1.Image != null) { //扩展名判断 if (CheckFileExtension(this.Tag.ToString()) == GFBEFUNC.FileExtension.PDF) { return; } Image oSrc = pictureBox1.Image; Bitmap oDst = new Bitmap(oSrc); oDst.RotateFlip(RotateFlipType.Rotate270FlipNone); pictureBox1.Image = oDst; piRoteSum = piRoteSum + 270; if (!pbRotateSaveFlg) { return; } ImageSave((Bitmap)pictureBox1.Image, 100, pictureBox1.ImageLocation,0,0); } } /// <summary> /// 右旋 /// </summary> public void RotateRight() { if (pictureBox1.Image != null) { //扩展名判断 if (CheckFileExtension(this.Tag.ToString()) == GFBEFUNC.FileExtension.PDF) { return; } Image oSrc = pictureBox1.Image; Bitmap oDst = new Bitmap(oSrc); oDst.RotateFlip(RotateFlipType.Rotate90FlipNone); pictureBox1.Image = oDst; piRoteSum = piRoteSum + 90; if (!pbRotateSaveFlg) { return; } ImageSave((Bitmap)pictureBox1.Image, 100, pictureBox1.ImageLocation,0,0); } } /// <summary> /// 清除图片的记忆位置 /// </summary> public void ClearImageMemory() { if (pictureBox1.Image != null) { pictureBox1.Image.Dispose(); } if (pictureBox2.Image != null) { pictureBox2.Image.Dispose(); } if (!webBrowser1.IsDisposed) { webBrowser1.Dispose(); } } /// <summary> /// 利用GC回收释放内存 /// </summary> public void GCCollect() { pictureBox1.Image = null; pictureBox2.Image = null; webBrowser1 = null; }
/// <summary> /// 保存图片 /// <param name="src">图片地址</param> /// <param name="scale">比例</param> /// <param name="asSaveFile"></param> /// <param name="aiWidth">宽度</param> /// <param name="aiHeight">高度</param> public static void ImageSave(Bitmap src, int scale, string asSaveFile, int aiWidth, int aiHeight) { int w = src.Width; int h = src.Height; if (scale < 100) { w = aiWidth; h = aiHeight; } Bitmap dest = new Bitmap(w, h); Graphics g = Graphics.FromImage(dest); g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.High; g.DrawImage(src, 0, 0, w, h); g.Dispose(); dest.Save(asSaveFile, ImageFormat.Jpeg); dest.Dispose(); }
public static FileExtension CheckFileExtension(string fileName) { if (!File.Exists(fileName)) { return FileExtension.VALIDFILE; } FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); System.IO.BinaryReader br = new System.IO.BinaryReader(fs); string fileType = string.Empty; FileExtension extension = FileExtension.VALIDFILE; try { byte data = br.ReadByte(); fileType += data.ToString(); data = br.ReadByte(); fileType += data.ToString(); extension = (FileExtension)Enum.Parse(typeof(FileExtension), fileType); if (extension.ToString().Equals(fileType)) { extension = FileExtension.VALIDFILE; } } catch { extension = FileExtension.VALIDFILE; } finally { if (fs != null) { fs.Close(); br.Close(); } } return extension; } public enum FileExtension { JPEG = 255216, TIF = 7373, GIF = 7173, BMP = 6677, PNG = 13780, PDF = 3780, VALIDFILE = 9999999 }
贴出来的核心代码: