I would like to compare similar images faster using the LockBits method as follows
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 ); } }
but during the second marshal. Copy an AccessViolationException event occurred:
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)
What is wrong with my program?
Thanks.
source share