예제 #1
0
        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();
        }
예제 #2
0
        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();
        }
예제 #3
0
        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);
        }