【C#/WPF】圖片的切割/切圖/裁剪圖片
阿新 • • 發佈:2018-08-14
height pre template urn sin ati ttr panel raw 原文:【C#/WPF】圖片的切割/切圖/裁剪圖片
前臺準備兩個Image控件。上面是顯示原圖,下面顯示切割後的效果。
<StackPanel Orientation="Vertical">
<Image Width="450" Height="383" Source="C:\Users\Administrator\Documents\Visual Studio 2015\Projects\SplitPic\SplitPic\Images\1.jpg"/>
<Image x:Name="img" Stretch="None" Width="450" Height="383" />
</StackPanel>
對應的後臺代碼:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 設置原圖
img.Source = new BitmapImage(new Uri(@"Images/1.jpg", UriKind.Relative));
// 切割圖片
ImageSource imageSource = img.Source;
Bitmap bitmap = SystemUtils.ImageSourceToBitmap(imageSource);
BitmapSource bitmapSource = SystemUtils.BitmapToBitmapImage(bitmap);
BitmapSource newBitmapSource = SystemUtils.CutImage(bitmapSource, new Int32Rect(125, 60, 235, 285 ));
// 使用切割後的圖源
img.Source = newBitmapSource;
}
}
// 圖像工具類
public static class SystemUtils
{
/// <summary>
/// 切圖
/// </summary>
/// <param name="bitmapSource">圖源</param>
/// <param name="cut">切割區域</param>
/// <returns></returns>
public static BitmapSource CutImage(BitmapSource bitmapSource, Int32Rect cut)
{
//計算Stride
var stride = bitmapSource.Format.BitsPerPixel * cut.Width / 8;
//聲明字節數組
byte[] data = new byte[cut.Height * stride];
//調用CopyPixels
bitmapSource.CopyPixels(cut, data, stride, 0);
return BitmapSource.Create(cut.Width, cut.Height, 0, 0, PixelFormats.Bgr32, null, data, stride);
}
// ImageSource --> Bitmap
public static System.Drawing.Bitmap ImageSourceToBitmap(ImageSource imageSource)
{
BitmapSource m = (BitmapSource)imageSource;
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
System.Drawing.Imaging.BitmapData data = bmp.LockBits(
new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBits(data);
return bmp;
}
// Bitmap --> BitmapImage
public static BitmapImage BitmapToBitmapImage(Bitmap bitmap)
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Bmp);
stream.Position = 0;
BitmapImage result = new BitmapImage();
result.BeginInit();
// According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
// Force the bitmap to load right now so we can dispose the stream.
result.CacheOption = BitmapCacheOption.OnLoad;
result.StreamSource = stream;
result.EndInit();
result.Freeze();
return result;
}
}
}
運行後的效果如下:
補充:關於剪裁的位置和區域的填寫說明,如下圖。
【C#/WPF】圖片的切割/切圖/裁剪圖片