private void SetMetadataToImage(Image image) { MasterMetadata metadata = ImageMetadata.MetadataFromImage(image); metadata._criteria.Clear(); metadata._criteria.AddRange(_masterIndex.GetCurrentCriteriaValue().Keys); ImageMetadata.SetMetadataToImage(metadata, image); }
private AsyncData CommonCompare(IntPtr hwnd, System.Drawing.Rectangle rect, ManualResetEvent resetEvent) { _counter++; Bitmap masterImage = _masterIndex.Resolve(); string masterName = string.Empty; if (masterImage != null) { masterName = _masterIndex.ResolvedMasterName; Microsoft.Test.Logging.GlobalLog.LogStatus("Picking master '" + masterName + "'"); } else { Microsoft.Test.Logging.GlobalLog.LogStatus("No Matching master found !"); } if (_stabilizeWindowBeforeCapture) { StabilizeWindow(hwnd, masterImage); } Bitmap actualImage; if (rect != System.Drawing.Rectangle.Empty) { actualImage = SnapshotRect(rect); } else { actualImage = SnapshotWindow(hwnd); } if (masterImage == null) { Microsoft.Test.Logging.GlobalLog.LogStatus("Encoding information in new master"); MasterMetadata metadata = ImageMetadata.MetadataFromImage(actualImage); metadata._criteria.Clear(); metadata._criteria.AddRange(_masterIndex.GetCurrentCriteriaValue().Keys); ImageMetadata.SetMetadataToImage(metadata, actualImage); // Save rendered as actual string actualName = ".\\Actual_" + _counter + IMAGE_EXTENSION; actualImage.Save(actualName, System.Drawing.Imaging.ImageFormat.Tiff); Microsoft.Test.Logging.GlobalLog.LogFile(actualName); // Save render with new name already set actualName = _masterIndex.GetNewMasterName(); Microsoft.Test.Logging.GlobalLog.LogStatus("Saving master as '" + System.IO.Path.GetFileName(actualName) + "'"); actualImage.Save(actualName, System.Drawing.Imaging.ImageFormat.Tiff); Microsoft.Test.Logging.GlobalLog.LogFile(actualName); } return(new AsyncData(masterImage, masterName, actualImage, resetEvent, _toleranceSettings, _counter)); }
internal Bitmap Resolve() { _resolvedMasterName = string.Empty; if (System.IO.Directory.Exists(_path) == false) { return(null); } // Get the current Dimensions (and its the values) for what the user cares about Dictionary <IMasterDimension, string> expectedDimensions = GetCurrentCriteriaValue(); // Get all masters with for this testcase string[] files = System.IO.Directory.GetFiles(_path, FileName); // Loop thru all potential masters int[] matchingScores = new int[files.Length]; for (int fileIndex = 0; fileIndex < files.Length; fileIndex++) { matchingScores[fileIndex] = 0; MasterMetadata masterMetadata = null; using (Image img = new Bitmap(files[fileIndex])) { // Retrieve Image metadata (Description and Criteria) for each master masterMetadata = ImageMetadata.MetadataFromImage(img); } // Check that every master dimensions are required by the user foreach (KeyValuePair <IMasterDimension, string> masterDim in masterMetadata.Criteria) { if (expectedDimensions.ContainsKey(masterDim.Key) == false) { // User did not specfy this Dimension matchingScores[fileIndex] = -1; break; } if (expectedDimensions[masterDim.Key].ToLowerInvariant() != masterDim.Value.ToLowerInvariant()) { // Dimension specified by user but this machine is not the right value. matchingScores[fileIndex] = -1; break; } matchingScores[fileIndex] += _weightedCriteria[masterDim.Key]; } } // Find the best master int bestMatchIndex = -1; int bestScore = -1; for (int t = 0; t < matchingScores.Length; t++) { if (matchingScores[t] > bestScore) { bestScore = matchingScores[t]; bestMatchIndex = t; } } if (bestMatchIndex == -1) { return(null); } _resolvedMasterName = files[bestMatchIndex]; return(new Bitmap(files[bestMatchIndex])); }
private void DoVscanCompare(object asyncData) { AsyncData data = asyncData as AsyncData; if (data == null) { throw new ArgumentException("Parameter passed in to the Method not of type AsyncData (or null)", "asyncData"); } ImageComparator ic = new ImageComparator(); ic.Curve.CurveTolerance.LoadTolerance(data.ToleranceSettings.XmlNodeTolerance); IImageAdapter masterAdapter = new ImageAdapter(data.MasterImage); IImageAdapter capturedAdapter = new ImageAdapter(data.CapturedImage); // compare Master to the Capture image using the Compare overload that will scale the images size accounting for the DPI data.Result.Succeeded = ic.Compare(masterAdapter, MetadataInfoHelper.GetDpi(masterAdapter), capturedAdapter, MetadataInfoHelper.GetDpi(capturedAdapter), false); if (data.Result.Succeeded == false) { Microsoft.Test.Logging.GlobalLog.LogStatus("Regular comparison failed"); } // On filaure, check if user whats to filter the image ( IgnoreAntiAliasing will do ) IImageAdapter masterFiltered = null; IImageAdapter captureFiltered = null; if (data.Result.Succeeded == false && data.ToleranceSettings.Filter != null) { // first save error diff image string errorDiffName = ".\\ErrorDiff_" + data.Index + IMAGE_EXTENSION; ImageUtility.ToImageFile(ic.GetErrorDifference(ErrorDifferenceType.IgnoreAlpha), errorDiffName); Microsoft.Test.Logging.GlobalLog.LogFile(errorDiffName); // Compare failed, filter the images and retry Microsoft.Test.Logging.GlobalLog.LogStatus("Filtering and recompare"); masterFiltered = data.ToleranceSettings.Filter.Process(masterAdapter); captureFiltered = data.ToleranceSettings.Filter.Process(capturedAdapter); data.Result.Succeeded = ic.Compare(masterFiltered, captureFiltered, false); if (data.Result.Succeeded == false) { Microsoft.Test.Logging.GlobalLog.LogStatus("==> Filtered comparison failed as well"); } } if (data.Result.Succeeded) { Microsoft.Test.Logging.GlobalLog.LogStatus("Comparison SUCCEEDED."); } else { // Save Masters * filtered master for easy analysis string masterName = ".\\Master_" + data.Index + IMAGE_EXTENSION; data.MasterImage.Save(masterName, System.Drawing.Imaging.ImageFormat.Tiff); Microsoft.Test.Logging.GlobalLog.LogFile(masterName); if (masterFiltered != null) { string filteredMasterName = ".\\MasterFiltered_" + data.Index + IMAGE_EXTENSION; using (Bitmap filteredMaster = ImageUtility.ToBitmap(masterFiltered)) { SetMetadataToImage(filteredMaster); filteredMaster.Save(filteredMasterName, System.Drawing.Imaging.ImageFormat.Tiff); } Microsoft.Test.Logging.GlobalLog.LogFile(filteredMasterName); } // Save rendered image (as "Actual_n") for easy analysis string capturedName = ".\\Actual_" + data.Index + IMAGE_EXTENSION; data.CapturedImage.Save(capturedName, System.Drawing.Imaging.ImageFormat.Tiff); Microsoft.Test.Logging.GlobalLog.LogFile(capturedName); // Save actual filtered for easy analysis if (captureFiltered != null) { string filteredRenderedName = ".\\ActualFiltered_" + data.Index + IMAGE_EXTENSION; using (Bitmap filteredRendered = ImageUtility.ToBitmap(captureFiltered)) { SetMetadataToImage(filteredRendered); filteredRendered.Save(filteredRenderedName, System.Drawing.Imaging.ImageFormat.Tiff); } Microsoft.Test.Logging.GlobalLog.LogFile(filteredRenderedName); } // Master might need to be updated, save with correct name and metadata // // In this image, encode full criteria string name = System.IO.Path.GetFileName(data.MasterName); string originalName = name.Replace(IMAGE_EXTENSION, "_FullCtriteria" + IMAGE_EXTENSION); Microsoft.Test.Logging.GlobalLog.LogStatus("Saving master with all criteria (new master) as '" + originalName + "'"); SetMetadataToImage(data.CapturedImage); data.CapturedImage.Save(originalName, System.Drawing.Imaging.ImageFormat.Tiff); Microsoft.Test.Logging.GlobalLog.LogFile(originalName); // // In this image, encode only criteria that match the master string originalNameFull = name.Replace(IMAGE_EXTENSION, "_MatchingCriteria" + IMAGE_EXTENSION); Microsoft.Test.Logging.GlobalLog.LogStatus("Saving master with matching criteria encoded (to replace previous master) as '" + originalNameFull + "'"); MasterMetadata metadata = ImageMetadata.MetadataFromImage(data.MasterImage); // Keep master Criteria but update its Description. IMasterDimension[] keys = new IMasterDimension[metadata.Description.Count]; metadata.Description.Keys.CopyTo(keys, 0); for (int t = 0; t < keys.Length; t++) { metadata.Description[keys[t]] = keys[t].GetCurrentValue(); } ImageMetadata.SetMetadataToImage(metadata, data.CapturedImage); data.CapturedImage.Save(originalNameFull, System.Drawing.Imaging.ImageFormat.Tiff); Microsoft.Test.Logging.GlobalLog.LogFile(originalNameFull); // first save error diff image string errorDiffFilterName = ".\\ErrorDiffFiltered_" + data.Index + IMAGE_EXTENSION; if (data.ToleranceSettings.Filter == null) { // Not filter were applied, change name (so it's not confusing) errorDiffFilterName = ".\\ErrorDiff_" + data.Index + IMAGE_EXTENSION; } ImageUtility.ToImageFile(ic.GetErrorDifference(ErrorDifferenceType.IgnoreAlpha), errorDiffFilterName); Microsoft.Test.Logging.GlobalLog.LogFile(errorDiffFilterName); } data.Result.IsCompleted = true; if (data.SynchronizationObject != null) { data.SynchronizationObject.Set(); } }