private void SearchStart() { var bitmap = drawBox.GetBitMap(); if (!ImageCompareSystem.SetOriginalImage(bitmap)) { MessageBox.Show("알 수 없는 오류 입니다"); return; } if (!Directory.Exists(dirPath)) { MessageBox.Show("이미지를 찾을 폴더를 선택해 주세요"); return; } ClearResult(); while (fileQueue.TryDequeue(out var v)) { } if (!GetFileNames(dirPath, searchSubFolder.Checked, ref fileQueue)) { MessageBox.Show("파일 목록을 불러오는 중 오류가 발생하였습니다"); return; } progressBar.Minimum = 0; progressBar.Maximum = fileQueue.Count; progressBar.Value = 0; UIstart(); ExcuteCompare(); }
private async void ExcuteCompare() { ImageCompareSystem.colorSimilarity = (float)ColorSimilarity.Value; float minsim = (float)ImageSimilarity.Value; while (true) { if (!fileQueue.TryDequeue(out var fullName) || isSearching == false) { break; } progressBar.Value++; try { using (var dstBitmap = (Bitmap)Image.FromFile(fullName)) { var simul = await ImageCompareSystem.CompareWithBitmapAsync(dstBitmap); if (simul > minsim) { var transparentBitmap = TransparentProcessing(dstBitmap); dstBitmap.Dispose(); var fileName = fullName.Split('\\').Last(); resultImageList.Images.Add(fileName, transparentBitmap); var item = new ListViewItem(fileName, resultImageList.Images.Count - 1) { Name = fullName }; resultImageView.Items.Add(item); if (resultImageView.SelectedItems.Count == 0 && resultImageView.FocusedItem != null) { resultImageView.FocusedItem.Focused = false;// focus 취소가 안되서 강제로 취소시킴 } //if (autoScrolling) // resultImageView.Items[resultImageView.Items.Count - 1].EnsureVisible(); } } } catch (OutOfMemoryException) {// 갤에서 받은 특이한 이미지들이 여기서 걸러짐 ex) 솦갤 전통, 깨진 파일, 잘못된 확장자 등 continue; } catch (Exception error) { MessageBox.Show(error.Message, "에러", MessageBoxButtons.OK, MessageBoxIcon.Error); } } UIend(); }
private Bitmap TransparentProcessing(Bitmap dstBitmap) {// 검색이 끝난 이미지를 표시하기 위해 알맞은 비율로 조절하고 빈자리는 투명화 시킴 이 작업이 없으면 이미지가 늘어남 var targetSize = resultImageList.ImageSize; ImageCompareSystem.ImageRatioCalculation(dstBitmap.Width, dstBitmap.Height, targetSize.Width, targetSize.Height, out var multiple, out var widthRatio, out var heightRatio); var size = new Size((int)(widthRatio * multiple), (int)(heightRatio * multiple)); var resizeBitmap = new Bitmap(dstBitmap, size); var transparentBitmap = new Bitmap(targetSize.Width, targetSize.Height); transparentBitmap.MakeTransparent(); using (Graphics g = Graphics.FromImage(transparentBitmap)) { g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy; g.DrawImage(resizeBitmap, (transparentBitmap.Width - size.Width) * 0.5f, (transparentBitmap.Height - size.Height) * 0.5f, size.Width, size.Height); } return(transparentBitmap); }