public static void Run(ref byte[] decomp, int width) { BitmapData bmpDespeckle; if (width == 400) { bmpDespeckle = bmpDespeckleTop.LockBits(new Rectangle(0, 0, bmpDespeckleTop.Width, bmpDespeckleTop.Height), ImageLockMode.ReadWrite, bmpDespeckleTop.PixelFormat); } else { bmpDespeckle = bmpDespeckleBottom.LockBits(new Rectangle(0, 0, bmpDespeckleBottom.Width, bmpDespeckleBottom.Height), ImageLockMode.ReadWrite, bmpDespeckleBottom.PixelFormat); } Marshal.Copy(decomp, 0, bmpDespeckle.Scan0, decomp.Length); if ((Type)UseFilter == Type.AForgeLite) { // Very close to Magick and faster! AForgeFilter.KernelSize = 3; AForgeFilter.ColorFactor = 10; AForgeFilter.ApplyInPlace(bmpDespeckle); // Don't make a new array for decomp, will make it slow. Marshal.Copy(bmpDespeckle.Scan0, decomp, 0, decomp.Length); } else if ((Type)UseFilter == Type.Magick) { //Magick is SLOWWWW magick = new ImageMagick.MagickImage(); if (width == 400) { magick.Read(bmpDespeckleTop); } else { magick.Read(bmpDespeckleBottom); } magick.Despeckle(); decomp = magick.ToByteArray(ImageMagick.MagickFormat.Bgr); //Use in place of bmpData.Scan0, bloody slow magick.Dispose(); } if (width == 400) { bmpDespeckleTop.UnlockBits(bmpDespeckle); } else { bmpDespeckleBottom.UnlockBits(bmpDespeckle); } }
private bool AreVisuallyDifferent(Texture2D img1, Texture2D img2, Config config) { using (ImageMagick.MagickImage s1 = new ImageMagick.MagickImage()) { s1.Read(img1.EncodeToJPG(config.screenshotQuality)); using (ImageMagick.MagickImage s2 = new ImageMagick.MagickImage()) { s2.Read(img2.EncodeToJPG(config.screenshotQuality)); var errorMetric = EnumUtil.Parse <ImageMagick.ErrorMetric>(config.errorMetric); var diffValue = s1.CompareV2(s2, errorMetric, out ImageMagick.MagickImage diffImg); if (diffValue < config.maxAllowedDiff) { return(false); } diffImg.Dispose(); } } return(true); }