的時候,我想更多的比較類似的圖像使用LockBits方法更快如下AccessViolation使用LockBits
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
public class CompareImages {
public static void Main (String[] args) {
Bitmap bm1 = new Bitmap ("PB270029.JPG");
Console.WriteLine (bm1.PixelFormat.ToString());
int width = bm1.Width;
int height = bm1.Height;
Console.WriteLine ("width = " + width + " height = " + height);
Rectangle rect1 = new Rectangle (0, 0, width, height);
BitmapData bm1Data = bm1.LockBits (rect1, ImageLockMode.ReadOnly, bm1.PixelFormat);
Console.WriteLine ("stride = " + bm1Data.Stride);
IntPtr bm1Ptr = bm1Data.Scan0;
int bytes = Math.Abs(bm1Data.Stride) * height;
Console.WriteLine ("bytes = " + bytes);
byte[] rgbValues1 = new byte [ bytes ];
Marshal.Copy (bm1Ptr, rgbValues1, 0, bytes);
Console.WriteLine ("After 1st Marshal.Copy ...");
Bitmap bm2 = new Bitmap ("PA050164.JPG");
Rectangle rect2 = new Rectangle (0, 0, bm2.Width, bm2.Height);
BitmapData bm2Data = bm2.LockBits (rect2, ImageLockMode.ReadOnly, bm2.PixelFormat);
IntPtr bm2Ptr = bm2Data.Scan0;
byte[] rgbValues2 = new byte [ Math.Abs(bm2Data.Stride) * bm2.Height ];
Marshal.Copy (bm2Ptr, rgbValues2, 0, rgbValues2.Length);
}
}
但第二Marshal.Copy期間發生AccessViolationException:
C:\CompareImages>csc CompareImages.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.
C:\CompareImages>CompareImages.exe
Format24bppRgb
width = 3648 height = 2736
stride = 10944
bytes = 29942784
After 1st Marshal.Copy ...
Unhandled Exception: System.AccessViolationException: Attempted to read or write
protected memory. This is often an indication that other memory is corrupt.
at System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object
destination, Int32 startIndex, Int32 length)
at CompareImages.Main(String[] args)
是什麼我的程序錯了嗎?
謝謝。
你可以嘗試用`bm1.UnlockBits(bmpData)``第一次複製後解鎖嗎? – CharlesB 2011-01-27 13:45:46
是的,我試過了,但結果是一樣的。此外,我不明白如何可以與處理第二個位圖鏈接。 – Yury 2011-01-27 13:59:41
你可以嘗試從新的數組分配中刪除Math.Abs嗎?我非常確定步幅總是正數,如果我是你,我會避免將int轉換爲double並返回。 – Biggles 2011-01-27 14:04:05