using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging; namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm { public static class ImageAlgorithmTools { /// /// 根据ROI裁剪图像 /// /// /// /// /// public static Bitmap CropBitmap(Bitmap sourceBitmap, Rectangle roi) { // 检查边界 if (roi.X < 0 || roi.Y < 0 || roi.Right > sourceBitmap.Width || roi.Bottom > sourceBitmap.Height) { throw new ArgumentException("ROI区域超出源图像边界"); } // 创建目标位图 Bitmap result = new Bitmap(roi.Width, roi.Height, sourceBitmap.PixelFormat); // 锁定位图数据 BitmapData sourceData = sourceBitmap.LockBits( new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height), ImageLockMode.ReadOnly, sourceBitmap.PixelFormat); BitmapData resultData = result.LockBits( new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, result.PixelFormat); try { unsafe { byte* sourcePtr = (byte*)sourceData.Scan0; byte* resultPtr = (byte*)resultData.Scan0; int pixelSize = Image.GetPixelFormatSize(sourceBitmap.PixelFormat) / 8; int sourceStride = sourceData.Stride; int resultStride = resultData.Stride; for (int y = 0; y < roi.Height; y++) { byte* srcRow = sourcePtr + (roi.Y + y) * sourceStride + roi.X * pixelSize; byte* dstRow = resultPtr + y * resultStride; // 复制一行像素数据 for (int x = 0; x < roi.Width * pixelSize; x++) { dstRow[x] = srcRow[x]; } } } } finally { sourceBitmap.UnlockBits(sourceData); result.UnlockBits(resultData); } return result; } /// /// Bitmap 转 BitmapImage 的辅助方法 /// /// /// public static BitmapImage ConvertToBitmapImage(Bitmap bitmap) { using (MemoryStream memory = new MemoryStream()) { bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png); memory.Position = 0; var bitmapImage = new BitmapImage(); bitmapImage.BeginInit(); bitmapImage.CacheOption = BitmapCacheOption.OnLoad; bitmapImage.DecodePixelWidth = 1440; // 设置目标分辨率宽度 bitmapImage.DecodePixelHeight = 1080; // 保持宽高比 bitmapImage.StreamSource = memory; bitmapImage.EndInit(); return bitmapImage; } } } }