C#實(shí)現(xiàn)圖片切割、切圖、裁剪
本文實(shí)例為大家分享了C#實(shí)現(xiàn)圖片切割、切圖的具體代碼,供大家參考,具體內(nèi)容如下
前臺(tái)準(zhǔn)備兩個(gè)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>
對(duì)應(yīng)的后臺(tái)代碼:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 設(shè)置原圖
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">切割區(qū)域</param>
/// <returns></returns>
public static BitmapSource CutImage(BitmapSource bitmapSource, Int32Rect cut)
{
//計(jì)算Stride
var stride = bitmapSource.Format.BitsPerPixel * cut.Width / 8;
//聲明字節(jié)數(shù)組
byte[] data = new byte[cut.Height * stride];
//調(diào)用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;
}
}
}
運(yùn)行后的效果如下:

補(bǔ)充:關(guān)于剪裁的位置和區(qū)域的填寫說明,如下圖。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#實(shí)現(xiàn)動(dòng)態(tài)生成靜態(tài)頁(yè)面的類詳解
- C#中實(shí)現(xiàn)偽靜態(tài)頁(yè)面兩種方式介紹
- C#用委托BeginInvoke做異步線程
- mongodb使用c#驅(qū)動(dòng)數(shù)據(jù)插入demo
- C# Winform實(shí)現(xiàn)石頭剪刀布游戲
- c#操作mongodb插入數(shù)據(jù)效率
- C#引用類型和值類型的適用場(chǎng)合和區(qū)別
- C#自動(dòng)類型轉(zhuǎn)換與強(qiáng)制類型轉(zhuǎn)換的講解
- 解析在C#中接口和類的異同
- C#網(wǎng)站生成靜態(tài)頁(yè)面的實(shí)例講解
相關(guān)文章
C#基礎(chǔ):基于const與readonly的深入研究
本篇文章是對(duì)c#中const與readonly進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)的ACCESS數(shù)據(jù)庫(kù)操作類完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的ACCESS數(shù)據(jù)庫(kù)操作類,結(jié)合完整實(shí)例形式分析了C#針對(duì)access數(shù)據(jù)庫(kù)增刪改查、事務(wù)、結(jié)果處理等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
C#實(shí)現(xiàn)windows系統(tǒng)重啟和關(guān)機(jī)的代碼詳解
這篇文章主要介紹了C#實(shí)現(xiàn)windows系統(tǒng)重啟和關(guān)機(jī)的的方法,涉及C#調(diào)用windows系統(tǒng)命令實(shí)現(xiàn)控制開機(jī)、關(guān)機(jī)等操作的技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2024-02-02
利用AOP實(shí)現(xiàn)SqlSugar自動(dòng)事務(wù)
這篇文章主要為大家詳細(xì)介紹了利用AOP實(shí)現(xiàn)SqlSugar自動(dòng)事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

