Commit 21ab2fd1 by liulongfei
parents 3e43799f b5d858a0
...@@ -198,6 +198,27 @@ namespace VIZ.Package.Module ...@@ -198,6 +198,27 @@ namespace VIZ.Package.Module
} }
/// <summary>
/// 创建截图文件
/// </summary>
/// <param name="filePath"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public async Task<fileUploadResult> CreateCutImageFile(Bitmap bitmap,string fileName)
{
string requestUri = string.Format("{0}UplodFile?filePath={1}", ApplicationDomainEx.MediaConfig.Url, this.Support.SelectedFolderModel.Path + "\\");
fileUploadResult upLoadResult = await MediaResourceFileService.PostCutImage<fileUploadResult>(requestUri, bitmap, fileName);
if (upLoadResult == null)
return null;
return upLoadResult;
}
/// <summary> /// <summary>
/// 删除文件 /// 删除文件
/// </summary> /// </summary>
......
...@@ -3,11 +3,13 @@ using log4net; ...@@ -3,11 +3,13 @@ using log4net;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Shapes;
namespace VIZ.Package.Module namespace VIZ.Package.Module
{ {
...@@ -178,7 +180,7 @@ namespace VIZ.Package.Module ...@@ -178,7 +180,7 @@ namespace VIZ.Package.Module
var content = new MultipartFormDataContent(); var content = new MultipartFormDataContent();
content.Headers.Add("ContentType", $"multipart/form-data"); content.Headers.Add("ContentType", $"multipart/form-data");
var b = new ByteArrayContent(System.IO.File.ReadAllBytes(path)); var b = new ByteArrayContent(System.IO.File.ReadAllBytes(path));
content.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(path)), "image", fileName); content.Add(b, "image", fileName);
var response = await client.PostAsync(requestUri, content); var response = await client.PostAsync(requestUri, content);
var result = response.Content.ReadAsStringAsync().Result; var result = response.Content.ReadAsStringAsync().Result;
...@@ -191,5 +193,38 @@ namespace VIZ.Package.Module ...@@ -191,5 +193,38 @@ namespace VIZ.Package.Module
} }
} }
/// <summary>
/// 上传截图图片
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="requestUri"></param>
/// <param name="bitmap"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public static async Task<T> PostCutImage<T>(string requestUri, Bitmap bitmap, string fileName)
{
try
{
HttpClient client = new HttpClient();
var content = new MultipartFormDataContent();
content.Headers.Add("ContentType", $"multipart/form-data");
var b = ThumbnailHelper.BitmapToGrayByte(bitmap);
content.Add(new ByteArrayContent(b), "image", fileName);
var response = await client.PostAsync(requestUri, content);
var result = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<T>(result);
}
catch (Exception ex)
{
log.Error(ex.Message);
return default(T);
}
}
} }
} }
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
...@@ -199,6 +201,37 @@ namespace VIZ.Package.Module ...@@ -199,6 +201,37 @@ namespace VIZ.Package.Module
// 最后一个反斜杠后返回名称 // 最后一个反斜杠后返回名称
return path.Substring(lastIndex + 1); return path.Substring(lastIndex + 1);
} }
/// <summary>
/// byte数组转换
/// </summary>
/// <param name="bitmap"></param>
/// <returns></returns>
public static byte[] BitmapToGrayByte(Bitmap bitmap)
{
//// 申请目标位图的变量,并将其内存区域锁定
//BitmapData bitmapDat = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
//// 获取bmpData的内存起始位置
//IntPtr intPtr = bitmapDat.Scan0;
//byte[] image = new byte[bitmap.Width * bitmap.Height];//原始数据
// // 将数据复制到byte数组中,
//Marshal.Copy(intPtr, image, 0, bitmap.Width * bitmap.Height);
////解锁内存区域
//bitmap.UnlockBits(bitmapDat);
//return image;
// 1.先将BitMap转成内存流
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
ms.Seek(0, System.IO.SeekOrigin.Begin);
// 2.再将内存流转成byte[]并返回
byte[] bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
ms.Dispose();
return bytes;
}
#endregion #endregion
} }
} }
<UserControl x:Class="VIZ.Package.Module.ImageDealer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Name="MainGrid" MinHeight="200" MinWidth="200" >
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace VIZ.Package.Module
{
/// <summary>
/// Interaction logic for ImageDealer.xaml
/// </summary>
public partial class ImageDealer : UserControl
{
public static readonly RoutedEvent OnCutImagingEventHandler = EventManager.RegisterRoutedEvent("OnCutImaging", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ImageDealer));
#region 私有字段
/// <summary>
/// 截图控件
/// </summary>
public ImageDealerUnsafe _ImageDealerControl = new ImageDealerUnsafe();
/// <summary>
/// 图片源
/// </summary>
private BitmapImage _BitSource;
private int _ChangeMargin = 1;
#endregion
#region 公共字段
/// <summary>
/// 图片源
/// </summary>
public BitmapImage BitSource
{
get { return this._BitSource; }
set
{
this._BitSource = value;
this._ImageDealerControl.BitSource = value;
LocateInit();
}
}
/// <summary>
/// 截图事件
/// </summary>
public event RoutedEventHandler OnCutImaging
{
add { base.AddHandler(OnCutImagingEventHandler, value); }
remove { base.RemoveHandler(OnCutImagingEventHandler, value); }
}
#endregion
#region ==方法==
public ImageDealer()
{
InitializeComponent();
this._ImageDealerControl.OnCutImage += this.OnCutImage;
this.Loaded += UserControl_Loaded;
}
//外部截图
public void CutImage()
{
if (this.IsLoaded == true || this._ImageDealerControl == null)
{
this._ImageDealerControl.CutImage();
}
else
{
throw new Exception("尚未创建视图时无法截图!");
}
}
//截图控件位置初始化
private void LocateInit()
{
double Margin = 1;
if (this._BitSource != null)
{
double percent = 1;
//根据最小倍率放大截图控件
percent = (this._BitSource.PixelHeight * 1.0 / this.ActualHeight);
percent = percent < (this._BitSource.PixelWidth * 1.0 / this.ActualWidth) ? (this._BitSource.PixelWidth * 1.0 / this.ActualWidth) : percent;
this._ImageDealerControl.Width = this._BitSource.PixelWidth * 1.0 / percent;
this._ImageDealerControl.Height = this._BitSource.PixelHeight * 1.0 / percent;
//初始化截图方块
this._ImageDealerControl.ImageArea.Width = this._ImageDealerControl.ImageArea.Height = 100 + _ChangeMargin;
_ChangeMargin = -_ChangeMargin;
this._ImageDealerControl.ImageArea.SetValue(VerticalAlignmentProperty, VerticalAlignment.Center);
this._ImageDealerControl.ImageArea.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Center);
this._ImageDealerControl.ImageArea.SetValue(MarginProperty, new Thickness(0));
//截图控件相对父控件Margin
this._ImageDealerControl.Width -= 2 * Margin;
this._ImageDealerControl.Height -= 2 * Margin;
this._ImageDealerControl.SetValue(VerticalAlignmentProperty, VerticalAlignment.Center);
this._ImageDealerControl.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Center);
this._ImageDealerControl.SetValue(MarginProperty, new Thickness(0));
}
}
#endregion
#region ==事件==
//截图回调
private void OnCutImage(BitmapSource bit)
{
RaiseEvent(new RoutedEventArgs(OnCutImagingEventHandler, bit));
}
//加载完成
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (this.MainGrid.Children.Contains(this._ImageDealerControl) == false)
{
this.MainGrid.Children.Add(this._ImageDealerControl);
this._ImageDealerControl.Width = this.ActualWidth;
this._ImageDealerControl.Height = this.ActualHeight;
this._ImageDealerControl.SetValue(VerticalAlignmentProperty, VerticalAlignment.Center);
this._ImageDealerControl.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Center);
this._ImageDealerControl.SetValue(MarginProperty, new Thickness(0));
}
}
/// <summary> 手动设置范围 </summary>
public void setImageAreaParemater(double x, double y, double width, double height)
{
_ImageDealerControl.setImageAreaParemater(x, y, width, height);
}
#endregion
}
}
<UserControl x:Class="VIZ.Package.Module.ImageDealerUnsafe"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Background="Transparent"
SnapsToDevicePixels="True"
PreviewMouseDown="UserControl_MouseDown" PreviewMouseUp="UserControl_MouseUp" MouseLeave="UserControl_MouseLeave" PreviewMouseMove="UserControl_MouseMove"
Loaded="onViewLoad"
>
<Grid Name="MainGrid" >
<Image Name="SoureceImage" Stretch="Uniform"></Image>
<Border Name="ImageArea" BorderBrush="Red" BorderThickness="1,1,1,1" Panel.ZIndex="5" Margin="50" SizeChanged="ImageArea_SizeChanged">
<Grid >
<Rectangle Name="R_LeftUp" Width="5" Height="5" Margin="-3" VerticalAlignment="Top" HorizontalAlignment="Left" Fill="White" Panel.ZIndex="0" Cursor="SizeNWSE"/>
<Rectangle Name="R_Up" Width="5" Height="5" Margin="-3" VerticalAlignment="Top" HorizontalAlignment="Center" Fill="White" Panel.ZIndex="0" Cursor="SizeNS"/>
<Rectangle Name="R_RightUp" Width="5" Height="5" Margin="-3" VerticalAlignment="Top" HorizontalAlignment="Right" Fill="White" Panel.ZIndex="0" Cursor="SizeNESW"/>
<Rectangle Name="R_Right" Width="5" Height="5" Margin="-3" VerticalAlignment="Center" HorizontalAlignment="Right" Fill="White" Panel.ZIndex="0" Cursor="SizeWE"/>
<Rectangle Name="R_RightDown" Width="5" Height="5" Margin="-3" VerticalAlignment="Bottom" HorizontalAlignment="Right" Fill="White" Panel.ZIndex="0" Cursor="SizeNWSE"/>
<Rectangle Name="R_Down" Width="5" Height="5" Margin="-3" VerticalAlignment="Bottom" HorizontalAlignment="Center" Fill="White" Panel.ZIndex="0" Cursor="SizeNS"/>
<Rectangle Name="R_LeftDown" Width="5" Height="5" Margin="-3" VerticalAlignment="Bottom" HorizontalAlignment="Left" Fill="White" Panel.ZIndex="0" Cursor="SizeNESW"/>
<Rectangle Name="R_Left" Width="5" Height="5" Margin="-3" VerticalAlignment="Center" HorizontalAlignment="Left" Fill="White" Panel.ZIndex="0" Cursor="SizeWE"/>
<!--<GridSplitter Height="5" Width="5" VerticalAlignment="Bottom" HorizontalAlignment="Stretch"></GridSplitter>-->
</Grid>
</Border>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace VIZ.Package.Module
{
/// <summary>
/// Interaction logic for ImageDealerUnsafe.xaml
/// </summary>
public partial class ImageDealerUnsafe : UserControl
{
#region 公共字段
//截图回调
public delegate void CutImageDelegate(BitmapSource bit);
public CutImageDelegate OnCutImage;
//图片原
private BitmapImage _BitSource;
public BitmapImage BitSource
{
get { return this._BitSource; }
set
{
this._BitSource = value;
this.SoureceImage.Source = value;
}
}
#endregion
#region 依赖属性
/// <summary>
/// 边距
/// </summary>
public double MaxMargin = 2;
//public Brush BorderBrush;
#endregion
#region ==私有字段==
/// <summary>
/// 鼠标样式
/// </summary>
private Cursor MouseCursor = Cursors.Arrow;
/// <summary>
/// 鼠标位置
/// </summary>
private MouseLocationEnum MouseLocation = MouseLocationEnum.None;
/// <summary>
/// 鼠标行为
/// </summary>
private MouseActionEx Action { get; set; }
/// <summary>
/// 边框粗细
/// </summary>
private double BorderWidth = 1;
/// <summary>
/// 拖拽前鼠标按下位置
/// </summary>
private Point MouseDownPoint;
/// <summary>
/// 拖拽前控件位置
/// </summary>
private Point MouseDownLocate;
#endregion
#region ==方法==
public ImageDealerUnsafe()
{
InitializeComponent();
}
/// <summary>
/// 计算区域圆点及宽高
/// </summary>
/// <param name="MouseButtonLocate">鼠标相对背景MainGrid位置</param>
/// <param name="IsRectangle">是否正方形</param>
/// <returns>NULL 或 具体值</returns>
private RectangleAreaModel CalculatedArea(Point MouseButtonLocate, bool IsRectangle)
{
Point Locate = this.ImageArea.TransformToAncestor((UIElement)this.MainGrid).Transform(new Point(0, 0));
//边框宽度
double BorderWidth = this.BorderWidth;
//整体宽度
double RectWidth = this.ImageArea.ActualWidth;
//整体高度
double RectHeight = this.ImageArea.ActualHeight;
//裁剪区域
Point OriginalPoint = new Point(0, 0);//圆点坐标
Point TheoryPoint = new Point(0, 0); //理论坐标
double TheoryWidth = 0; //理论宽度
double TheoryHeight = 0; //理论高度
switch (MouseLocation)
{
case MouseLocationEnum.Left:
{
this.Cursor = Cursors.SizeWE;
OriginalPoint = new Point(Locate.X + RectWidth - BorderWidth / 2, Locate.Y + RectHeight / 2);//右中部位置
TheoryWidth = OriginalPoint.X - MouseButtonLocate.X + BorderWidth;
TheoryHeight = IsRectangle == true ? TheoryWidth : RectHeight;
TheoryPoint = new Point(OriginalPoint.X + BorderWidth / 2 - TheoryWidth, OriginalPoint.Y - TheoryHeight / 2);
}
break;
case MouseLocationEnum.LeftUp:
{
this.Cursor = Cursors.SizeNWSE;
OriginalPoint = new Point(Locate.X + RectWidth - BorderWidth / 2, Locate.Y + RectHeight - BorderWidth / 2);//右下部位置
TheoryWidth = OriginalPoint.X - MouseButtonLocate.X + BorderWidth;
TheoryHeight = IsRectangle == true ? TheoryWidth : OriginalPoint.Y - MouseButtonLocate.Y + BorderWidth;
TheoryPoint = new Point(OriginalPoint.X + BorderWidth / 2 - TheoryWidth, OriginalPoint.Y + BorderWidth / 2 - TheoryHeight);
}
break;
case MouseLocationEnum.Up:
{
this.Cursor = Cursors.SizeNS;
OriginalPoint = new Point(Locate.X + RectWidth / 2, Locate.Y + RectHeight - BorderWidth / 2);//下中部位置
TheoryHeight = OriginalPoint.Y - MouseButtonLocate.Y + BorderWidth;
TheoryWidth = IsRectangle == true ? TheoryHeight : RectWidth;
TheoryPoint = new Point(OriginalPoint.X - TheoryWidth / 2, OriginalPoint.Y + BorderWidth / 2 - TheoryHeight);
}
break;
case MouseLocationEnum.RightUp:
{
this.Cursor = Cursors.SizeNESW;
OriginalPoint = new Point(Locate.X + BorderWidth / 2, Locate.Y + RectHeight - BorderWidth / 2);//左下部位置
TheoryWidth = MouseButtonLocate.X - OriginalPoint.X + BorderWidth;
TheoryHeight = IsRectangle == true ? TheoryWidth : MouseButtonLocate.Y - OriginalPoint.Y + BorderWidth;
TheoryPoint = new Point(OriginalPoint.X - BorderWidth / 2, OriginalPoint.Y + BorderWidth / 2 - TheoryHeight);
}
break;
case MouseLocationEnum.Right:
{
this.Cursor = Cursors.SizeWE;
OriginalPoint = new Point(Locate.X + BorderWidth / 2, Locate.Y + RectHeight / 2);//左中部位置
TheoryWidth = MouseButtonLocate.X - OriginalPoint.X + BorderWidth;
TheoryHeight = IsRectangle == true ? TheoryWidth : RectHeight;
TheoryPoint = new Point(OriginalPoint.X - BorderWidth / 2, OriginalPoint.Y - TheoryHeight / 2);
}
break;
case MouseLocationEnum.RightDown:
{
this.Cursor = Cursors.SizeNWSE;
OriginalPoint = new Point(Locate.X + BorderWidth / 2, Locate.Y + BorderWidth / 2);//左上部位置
TheoryWidth = MouseButtonLocate.X - OriginalPoint.X + BorderWidth;
TheoryHeight = IsRectangle == true ? TheoryWidth : MouseButtonLocate.Y - OriginalPoint.Y + BorderWidth;
TheoryPoint = new Point(OriginalPoint.X - BorderWidth / 2, OriginalPoint.Y - BorderWidth / 2);
}
break;
case MouseLocationEnum.Down:
{
this.Cursor = Cursors.SizeNS;
OriginalPoint = new Point(Locate.X + RectWidth / 2, Locate.Y + BorderWidth / 2);//上中部位置
TheoryHeight = MouseButtonLocate.Y - OriginalPoint.Y + BorderWidth;
TheoryWidth = IsRectangle == true ? TheoryHeight : RectWidth;
TheoryPoint = new Point(OriginalPoint.X - TheoryWidth / 2, OriginalPoint.Y - BorderWidth / 2);
}
break;
case MouseLocationEnum.LeftDown:
{
this.Cursor = Cursors.SizeNESW;
OriginalPoint = new Point(Locate.X + RectWidth - BorderWidth / 2, Locate.Y + BorderWidth / 2);//右上部位置
TheoryWidth = OriginalPoint.X - MouseButtonLocate.X + BorderWidth;
TheoryHeight = IsRectangle == true ? TheoryWidth : OriginalPoint.Y - MouseButtonLocate.Y + BorderWidth;
TheoryPoint = new Point(OriginalPoint.X + BorderWidth / 2 - TheoryWidth, OriginalPoint.Y - BorderWidth / 2);
}
break;
default:
return null;
}
return new RectangleAreaModel()
{
X = TheoryPoint.X,
Y = TheoryPoint.Y,
Width = TheoryWidth,
Height = TheoryHeight
};
}
/// <summary>
/// 图片剪切
/// </summary>
public void CutImage()
{
if (this.BitSource != null)
{
try
{
double ImageAreaWidth = this.ImageArea.ActualWidth;
double ImageAreaHeight = this.ImageArea.ActualHeight;
double GridWidth = this.MainGrid.ActualWidth;
double GridHeight = this.MainGrid.ActualHeight;
BitmapSource source = (BitmapSource)this.BitSource;
//计算比例
Point Locate = this.ImageArea.TransformToAncestor((UIElement)this.MainGrid).Transform(new Point(0, 0));
int dWidth = (int)((ImageAreaWidth * 1.0 / GridWidth) * source.PixelWidth);
int dHeight = (int)((ImageAreaHeight * 1.0 / GridHeight) * source.PixelHeight);
int dLeft = (int)((Locate.X * 1.0 / GridWidth) * source.PixelWidth);
int dTop = (int)((Locate.Y * 1.0 / GridHeight) * source.PixelHeight);
//像素区域
Int32Rect cutRect = new Int32Rect(dLeft, dTop, dWidth, dHeight);
//数组字节数
int stride = source.Format.BitsPerPixel * cutRect.Width / 8;
byte[] data = new byte[cutRect.Height * stride];
source.CopyPixels(cutRect, data, stride, 0);
//创建
BitmapSource bit = BitmapSource.Create(dWidth, dHeight, 0, 0, PixelFormats.Bgr32, null, data, stride);
//通知订阅
if (this.OnCutImage != null)
{
OnCutImage(bit);
}
}
catch
{
}
}
}
/// <summary>
/// 视图转图片
/// </summary>
/// <param name="vsual"></param>
/// <param name="nLeft"></param>
/// <param name="nTop"></param>
/// <param name="nWidth"></param>
/// <param name="nHeight"></param>
/// <returns></returns>
private RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int nLeft, int nTop, int nWidth, int nHeight)
{
var rtb = new RenderTargetBitmap(nWidth, nHeight, nLeft, nTop, PixelFormats.Default);
rtb.Render(vsual);
return rtb;
}
/// <summary>
/// Bitmap转图片
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
public BitmapSource ToBitmapSource(System.Drawing.Bitmap bmp)
{
BitmapSource returnSource;
try
{
returnSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
}
catch
{
returnSource = null;
}
return returnSource;
}
#endregion
#region ==事件==
//按下鼠标
private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
{
this.MouseLocation = MouseLocationEnum.None;
if (e.OriginalSource.GetType() == typeof(Rectangle))
{
Rectangle Act = e.OriginalSource as Rectangle;
switch (Act.Name)
{
case "R_Left": MouseLocation = MouseLocationEnum.Left; break;
case "R_LeftUp": MouseLocation = MouseLocationEnum.LeftUp; break;
case "R_Up": MouseLocation = MouseLocationEnum.Up; break;
case "R_RightUp": MouseLocation = MouseLocationEnum.RightUp; break;
case "R_Right": MouseLocation = MouseLocationEnum.Right; break;
case "R_RightDown": MouseLocation = MouseLocationEnum.RightDown; break;
case "R_Down": MouseLocation = MouseLocationEnum.Down; break;
case "R_LeftDown": MouseLocation = MouseLocationEnum.LeftDown; break;
default: MouseLocation = MouseLocationEnum.None; break;
}
this.Action = MouseActionEx.Drag;
}
else
{
this.MouseDownPoint = Mouse.GetPosition(e.Source as FrameworkElement);//WPF方法
this.MouseDownLocate = this.ImageArea.TransformToAncestor((UIElement)this.MainGrid).Transform(new Point(0, 0));
if ((this.MouseDownLocate.X < this.MouseDownPoint.X && this.MouseDownPoint.X < this.MouseDownLocate.X + this.ImageArea.ActualWidth) &&
(this.MouseDownLocate.Y < this.MouseDownPoint.Y && this.MouseDownPoint.Y < this.MouseDownLocate.Y + this.ImageArea.ActualHeight)
)
{
this.Action = MouseActionEx.DragMove;
}
}
}
//弹起鼠标
private void UserControl_MouseUp(object sender, MouseButtonEventArgs e)
{
this.Action = MouseActionEx.None;
this.Cursor = Cursors.Arrow;
}
//移动鼠标
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
//鼠标相对空间区域位置
Point MousePoint = e.GetPosition((IInputElement)this.MainGrid);
Point ImageLocate = this.ImageArea.TransformToAncestor((UIElement)this.MainGrid).Transform(new Point(0, 0));
if (ImageLocate.X <= MousePoint.X && MousePoint.X <= ImageLocate.X + this.ImageArea.ActualWidth &&
ImageLocate.Y <= MousePoint.Y && MousePoint.Y <= ImageLocate.Y + this.ImageArea.ActualHeight)
{
this.Cursor = Cursors.Hand;
}
else
{
this.Cursor = Cursors.Arrow;
}
//边框拉伸
if (this.Action == MouseActionEx.Drag)
{
this.Cursor = this.MouseCursor;
//剪辑图片区域宽高
double ImageAreaWidth = this.ImageArea.ActualWidth;
double ImageAreaHeight = this.ImageArea.ActualHeight;
//裁剪区域理论位置
RectangleAreaModel Model = this.CalculatedArea(MousePoint, true);
if (Model != null)
{
//不能超出边界区域
if (Model.X + Model.Width + MaxMargin > this.ActualWidth ||
Model.Y + Model.Height + MaxMargin > this.ActualHeight ||
Model.X < MaxMargin ||
Model.Y < MaxMargin
)
{
this.Cursor = Cursors.Arrow;
this.Action = MouseActionEx.None;
return;
}
this.ImageArea.Width = Model.Width;
this.ImageArea.Height = Model.Height;
this.ImageArea.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Left);
this.ImageArea.SetValue(VerticalAlignmentProperty, VerticalAlignment.Top);
this.ImageArea.SetValue(MarginProperty, new Thickness(Model.X, Model.Y, 0, 0));
CutImage();
}
}
else if (this.Action == MouseActionEx.DragMove)//拖动
{
double Left = this.MouseDownLocate.X + (MousePoint.X - MouseDownPoint.X);
double Top = this.MouseDownLocate.Y + (MousePoint.Y - MouseDownPoint.Y);
//不能超出边界区域
if (Left < MaxMargin ||
Top < MaxMargin ||
(Left + this.ImageArea.ActualWidth + MaxMargin) > this.ActualWidth ||
(Top + this.ImageArea.ActualHeight + MaxMargin) > this.ActualHeight)
{
this.Cursor = Cursors.Arrow;
this.Action = MouseActionEx.None;
return;
}
this.ImageArea.Width = this.ImageArea.ActualWidth;
this.ImageArea.Height = this.ImageArea.ActualHeight;
this.ImageArea.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Left);
this.ImageArea.SetValue(VerticalAlignmentProperty, VerticalAlignment.Top);
this.ImageArea.SetValue(MarginProperty, new Thickness(Left, Top, 0, 0));
CutImage();
}
else
{
//this.Cursor = Cursors.Arrow;
}
}
//鼠标离开
private void UserControl_MouseLeave(object sender, MouseEventArgs e)
{
this.Action = MouseActionEx.None;
}
//加载完成后截图
private void ImageArea_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.CutImage();
}
bool isload = false;
private void onViewLoad(object sender, RoutedEventArgs e)
{
isload = true;
if (initWidth != -1 && initHeight != -1)
{
setImageAreaParemater(initX, initY, initWidth, initHeight);
}
CutImage();
}
private double initX, initY, initWidth = -1, initHeight = -1;
public void setImageAreaParemater(double x, double y, double width, double height)
{
Console.WriteLine("is loaded " + isload);
if (!isload)
{
initX = x;
initY = y;
initWidth = width;
initHeight = height;
return;
}
ImageArea.Width = SoureceImage.ActualWidth / BitSource.PixelWidth * width;
ImageArea.Height = SoureceImage.ActualHeight / BitSource.PixelHeight * height;
ImageArea.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Left);
ImageArea.SetValue(VerticalAlignmentProperty, VerticalAlignment.Top);
Point SourceImagePoint = SoureceImage.TransformToAncestor((UIElement)MainGrid).Transform(new Point(0, 0));
//BitSource
double areaX = SourceImagePoint.X + SoureceImage.ActualWidth / BitSource.PixelWidth;
double areay = SourceImagePoint.Y + SoureceImage.ActualHeight / BitSource.PixelHeight;
ImageArea.SetValue(MarginProperty, new Thickness(areaX, areay, 0, 0));
}
#endregion
}
public enum MouseActionEx
{
None,
Drag,
DragMove,
}
public enum MouseLocationEnum
{
None, Left, LeftUp, Up, RightUp, Right, RightDown, Down, LeftDown
}
public class RectangleAreaModel
{
public double X { get; set; }
public double Y { get; set; }
public double Width { get; set; }
public double Height { get; set; }
}
}
<UserControl x:Class="VIZ.Package.Module.ImageEdit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:module="clr-namespace:VIZ.Package.Module"
mc:Ignorable="d"
d:DesignHeight="350" d:DesignWidth="525">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<module:ImageDealer Panel.ZIndex="0" x:Name="ImageDealer" Margin="20" OnCutImaging="ImageDealer_OnOnCutImaging">
</module:ImageDealer>
<StackPanel Grid.Column="1">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Image Name="CutImage" Grid.Column="1" Margin="5" VerticalAlignment="Top" ></Image>
<WrapPanel Grid.Row="1" VerticalAlignment="Center">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<TextBlock Text="高度:" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock x:Name="txt_Height" Grid.Column="1"/>
</Grid>
</WrapPanel>
<WrapPanel Grid.Row="2" VerticalAlignment="Center">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<TextBlock Text="宽度:" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock x:Name="txt_With" Grid.Column="1"/>
</Grid>
</WrapPanel>
<Button Content="截图" Grid.Row="3" Width="120" Command="{Binding Path=ImageCutCommand}" ></Button>
</Grid>
</StackPanel>
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using VIZ.Framework.Core;
namespace VIZ.Package.Module
{
/// <summary>
/// Interaction logic for ImageEdit.xaml
/// </summary>
public partial class ImageEdit : UserControl
{
ImageEditViewModel vm = new ImageEditViewModel();
public ImageEdit()
{
InitializeComponent();
WPFHelper.BindingViewModel(this, vm);
this.Loaded += ImageEdit_Loaded;
}
private void ImageEdit_Loaded(object sender, RoutedEventArgs e)
{
ImageDealer.BitSource = vm.OriginImage;
}
//private void Button_Click_1(object sender, RoutedEventArgs e)
//{
// ImageDealer.CutImage();
//}
private void ImageDealer_OnOnCutImaging(object sender, RoutedEventArgs e)
{
CutImage.Source = (BitmapSource)e.OriginalSource;
txt_Height.Text = CutImage.Source.Height.ToString();
txt_With.Text = CutImage.Source.Width.ToString();
vm.CutImage = vm.ImageSourceToBitmap(CutImage.Source);
}
}
}
<dx:ThemedWindow
x:Class="VIZ.Package.Module.ImageEditWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:module="clr-namespace:VIZ.Package.Module"
Title="编辑图片" Height="600" Width="600" >
<Grid>
<module:ImageEdit x:Name="ImageCut">
</module:ImageEdit>
</Grid>
</dx:ThemedWindow>
using DevExpress.Xpf.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace VIZ.Package.Module
{
/// <summary>
/// Interaction logic for ImageEditWindow.xaml
/// </summary>
public partial class ImageEditWindow : ThemedWindow
{
public ImageEditWindow()
{
InitializeComponent();
}
}
}
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
<MenuItem Header="移动文件" Command="{Binding Path=PlacementTarget.DataContext.MoveFileCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> <MenuItem Header="移动文件" Command="{Binding Path=PlacementTarget.DataContext.MoveFileCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<MenuItem Header="导出素材" Command="{Binding Path=PlacementTarget.DataContext.ExportFileCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> <MenuItem Header="导出素材" Command="{Binding Path=PlacementTarget.DataContext.ExportFileCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<!--<MenuItem Header="编辑图片" Command="{Binding Path=PlacementTarget.DataContext.EditImageCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>--> <MenuItem Header="编辑图片" Command="{Binding Path=PlacementTarget.DataContext.EditImageCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<Separator/> <Separator/>
<MenuItem Header="文件列表" Command="{Binding Path=PlacementTarget.DataContext.FilesListCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> <MenuItem Header="文件列表" Command="{Binding Path=PlacementTarget.DataContext.FilesListCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
</ContextMenu> </ContextMenu>
......
using log4net;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using VIZ.Framework.Core;
namespace VIZ.Package.Module
{
/// <summary>
/// 绑定
/// </summary>
public class ImageEditViewModel : ViewModelBase
{
/// <summary>
/// 日志
/// </summary>
private static readonly ILog log = LogManager.GetLogger(typeof(ImageEditViewModel));
public ImageEditViewModel()
{
ImageCutCommand = new VCommand(this.ImageCut);
}
/// <summary>
/// 截图命令
/// </summary>
public VCommand ImageCutCommand { get; set; }
/// <summary>
/// 源图
/// </summary>
public BitmapImage OriginImage { get; set; }
/// <summary>
/// 截图
/// </summary>
public Bitmap CutImage { get; set; }
private bool isEnter=false;
/// <summary>
/// 是否确定
/// </summary>
public bool IsEnter
{
get { return isEnter; }
set { isEnter = value; this.RaisePropertyChanged(nameof(IsEnter)); }
}
/// <summary>
/// BitMapImage转Bitmap
/// </summary>
/// <param name="bitmapImage"></param>
/// <returns></returns>
public Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
using (MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);
return new Bitmap(bitmap);
}
}
/// <summary>
/// bitmap 转BitmapImage
/// </summary>
/// <param name="bitmap"></param>
/// <returns></returns>
public BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
{
System.Drawing.Bitmap ImageOriginalBase = new System.Drawing.Bitmap(bitmap);
BitmapImage bitmapImage = new BitmapImage();
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
ImageOriginalBase.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
}
return bitmapImage;
}
/// <summary>
/// ImageSource转换为Bitmap
/// </summary>
/// <param name="_imagesource"></param>
/// <returns></returns>
public Bitmap ImageSourceToBitmap(ImageSource _imagesource)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)_imagesource));
encoder.Save(ms);
Bitmap bp = new Bitmap(ms);
ms.Close();
return bp;
}
/// <summary>
///截图方法
/// </summary>
private void ImageCut()
{
isEnter = true;
this.GetWindow()?.Close();
}
}
}
...@@ -9,10 +9,12 @@ using System.Drawing; ...@@ -9,10 +9,12 @@ using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Forms; using System.Windows.Forms;
using System.Windows.Shapes;
using VIZ.Framework.Core; using VIZ.Framework.Core;
using VIZ.Package.Domain; using VIZ.Package.Domain;
...@@ -798,9 +800,68 @@ namespace VIZ.Package.Module ...@@ -798,9 +800,68 @@ namespace VIZ.Package.Module
/// </summary> /// </summary>
public VCommand EditImageCommand { get; set; } public VCommand EditImageCommand { get; set; }
private void EditImage() private async void EditImage()
{ {
if (selectedFileModel == null || selectedFileModel.ThumbnailBitmap == null) return;
ImageEditWindow imageEditWindow = new ImageEditWindow();
ImageEditViewModel vm = imageEditWindow.ImageCut.DataContext as ImageEditViewModel;
vm.OriginImage = vm.BitmapToBitmapImage(selectedFileModel.ThumbnailBitmap);
imageEditWindow.ShowDialog();
if(vm.IsEnter)
{
string fileName = string.Format("{0}.png", GenerateStringID());
Bitmap bp = new Bitmap(vm.CutImage);
bool flag = false;
try
{
var fileResult = await this.mediaResourceFileController.CreateCutImageFile(bp, fileName);
if (fileResult != null && fileResult.errCode == "0")
{
flag = true;
}
else
{
flag = false;
}
}
catch (Exception ex)
{
log.Error(ex.Message);
}
if (flag)
{
if (this.SelectedFolderModel != null)
{
this.mediaResourceFileController.UpdateFileModels(this.SelectedFolderModel);
}
}
}
}
/// <summary>
/// 随机生成GuID字符串
/// </summary>
/// <returns></returns>
private string GenerateStringID()
{
long i = 1;
foreach (byte b in Guid.NewGuid().ToByteArray())
{
i *= ((int)b + 1);
}
return string.Format("{0:x}", i - DateTime.Now.Ticks);
} }
#endregion #endregion
......
...@@ -150,6 +150,19 @@ ...@@ -150,6 +150,19 @@
<Compile Include="Resource\MediaResource\Controller\Model\ms.cs" /> <Compile Include="Resource\MediaResource\Controller\Model\ms.cs" />
<Compile Include="Resource\MediaResource\Core\MHResourceFileDoubleClickEventArgs.cs" /> <Compile Include="Resource\MediaResource\Core\MHResourceFileDoubleClickEventArgs.cs" />
<Compile Include="Resource\MediaResource\Core\MHResourceSelectedFileChangedEventArgs.cs" /> <Compile Include="Resource\MediaResource\Core\MHResourceSelectedFileChangedEventArgs.cs" />
<Compile Include="Resource\MediaResource\ImageCut\ImageDealer.xaml.cs">
<DependentUpon>ImageDealer.xaml</DependentUpon>
</Compile>
<Compile Include="Resource\MediaResource\ImageCut\ImageDealerUnsafe.xaml.cs">
<DependentUpon>ImageDealerUnsafe.xaml</DependentUpon>
</Compile>
<Compile Include="Resource\MediaResource\ImageCut\ImageEdit.xaml.cs">
<DependentUpon>ImageEdit.xaml</DependentUpon>
</Compile>
<Compile Include="Resource\MediaResource\ImageCut\ImageEditWindow.xaml.cs">
<DependentUpon>ImageEditWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Resource\MediaResource\ViewModel\ImageEditViewModel.cs" />
<Compile Include="Setting\Conn\View\ConnSettingView.xaml.cs"> <Compile Include="Setting\Conn\View\ConnSettingView.xaml.cs">
<DependentUpon>ConnSettingView.xaml</DependentUpon> <DependentUpon>ConnSettingView.xaml</DependentUpon>
</Compile> </Compile>
...@@ -431,6 +444,22 @@ ...@@ -431,6 +444,22 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</Page> </Page>
<Page Include="Resource\MediaResource\ImageCut\ImageDealer.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Resource\MediaResource\ImageCut\ImageDealerUnsafe.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Resource\MediaResource\ImageCut\ImageEdit.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Resource\MediaResource\ImageCut\ImageEditWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Setting\Conn\View\ConnSettingView.xaml"> <Page Include="Setting\Conn\View\ConnSettingView.xaml">
<SubType>Designer</SubType> <SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment