Просмотр исходного кода

20251106001 图像格式处理与图像分割方法添加

向羽 孟 2 недель назад
Родитель
Сommit
5d492314c9

+ 101 - 0
MvvmScaffoldFrame48.DLL/ImageAlgorithm/ImageAlgorithmTools.cs

@@ -0,0 +1,101 @@
+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
+    {
+        /// <summary>
+        /// 根据ROI裁剪图像
+        /// </summary>
+        /// <param name="sourceBitmap"></param>
+        /// <param name="roi"></param>
+        /// <returns></returns>
+        /// <exception cref="ArgumentException"></exception>
+        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;
+        }
+
+        /// <summary>
+        /// Bitmap 转 BitmapImage 的辅助方法
+        /// </summary>
+        /// <param name="bitmap"></param>
+        /// <returns></returns>
+        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;
+            }
+        }
+    }
+}

+ 7 - 0
MvvmScaffoldFrame48.DLL/MvvmScaffoldFrame48.Dll.csproj

@@ -22,6 +22,7 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <PlatformTarget>x64</PlatformTarget>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -30,6 +31,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
     <DebugSymbols>true</DebugSymbols>
@@ -39,6 +41,7 @@
     <PlatformTarget>x64</PlatformTarget>
     <LangVersion>7.3</LangVersion>
     <ErrorReport>prompt</ErrorReport>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
     <OutputPath>bin\x64\Release\</OutputPath>
@@ -48,6 +51,7 @@
     <PlatformTarget>x64</PlatformTarget>
     <LangVersion>7.3</LangVersion>
     <ErrorReport>prompt</ErrorReport>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="MvCameraControl.Net, Version=4.5.0.2, Culture=neutral, PublicKeyToken=a3c7c5e3a730cd12, processorArchitecture=MSIL">
@@ -58,6 +62,7 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>DLL\MvFGCtrlC.Net.dll</HintPath>
     </Reference>
+    <Reference Include="PresentationCore" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Drawing" />
@@ -67,6 +72,7 @@
     <Reference Include="System.Data" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AlarmTools\AlarmMessageList.cs" />
@@ -79,6 +85,7 @@
     <Compile Include="ConfigTools\XMLReadWrite.cs" />
     <Compile Include="FileTools\PDFGenerate.cs" />
     <Compile Include="ImageAlgorithm\BoundRectangleClass.cs" />
+    <Compile Include="ImageAlgorithm\ImageAlgorithmTools.cs" />
     <Compile Include="LogTools\TxtLog.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="UserManager.cs" />