Crop 이미지를 C#에서 가져오는 방법?

안녕하세요! :smile:

제가 클립보드에 있는 이미지를 가져오는 부분을 구현 했는데요.

아래와 같은 상황에서는 정상 동작하고 있습니다.

  1. 프린트스크린 캡쳐
  2. 알트 + 프린트스크린 캡쳐
  3. 윈도우 + 쉬프트 + S 각종 갭쳐
  4. 캡쳐도구 캡쳐
  5. 이미지 파일 컨트롤 + C

하지만 그림판에서 부분적으로 선택한 후 컨트롤 + C 클립보드 복사시에는 정상적으로 이미지를 가져오지 못하고 있습니다.

아래는 제가 구현한 소스코드입니다.

protected override void OnPreviewKeyDown(KeyEventArgs e)
{
	base.OnPreviewKeyDown(e);

	if (e.Key == Key.V && (Keyboard.Modifiers 
            & ModifierKeys.Control) == ModifierKeys.Control)
	{
		if (Clipboard.GetDataObject() != null)
		{
			IDataObject data = Clipboard.GetDataObject();
			// 클립보드에 있던 데이타가 이미지 형식인지 검사
			if (data.GetDataPresent(DataFormats.Bitmap))
			{
				InteropBitmap bitmap = data.GetData(DataFormats.Bitmap, true);
				BitmapSource img = bitmap as BitmapSource;
				if (DataContext is CultureViewModel vm)
				{
					vm.Update(img);
				}
			}
		}
	}
}

해결하기 위해 어떻게 접근해야 할까요?

읽어주셔서 감사합니다. :smile:

좋아요 2

음… 설명이 부족해서 잘 모르겠지만 일단 이미지가 반드시 Bitmap 포맷이 아닐 수도 있고, 그림판이 클립보드에 저장하는게 반드시 이미지 데이터만 전달하는게 아닐 수 있으니까 Data 를 바로 파일로 저장한 뒤에 Hex Editor 로 살펴보시는게 어떨까요?

한마디로, 클립보드에서 가져오는 데이터가 어떤건지 확인이 필요해보입니다.

// 이 코드는 통과하고 문제가 생기는건가요?
if (data.GetDataPresent(DataFormats.Bitmap))
좋아요 2

@김예건 앗 맞습니다. 그 부분도 통과하고 bitmap, img 변수에도 null이 아닌 인스턴스가 다 채워지지만 이미지가 실제 이미지가 없는 것 같아요.

한번 그렇게 해보겠습니다!

감사합니다. :smile:

좋아요 1

동일한 코드와 다음의 유사한 코드로 테스트한 결과 동일한 문제점이 발견되었습니다.

		protected override void OnPreviewKeyDown(KeyEventArgs e)
		{
			base.OnPreviewKeyDown(e);

			if (e.Key == Key.V && (Keyboard.Modifiers
					& ModifierKeys.Control) == ModifierKeys.Control)
			{
				if (Clipboard.ContainsImage() == true)
                {
					var imageSource = Clipboard.GetImage();
					image.Source = imageSource;
				}
			}
		}

다음의 글을 참고하면 도움이 될 것 같습니다.

Wrestling with Clipboard Images in WPF - Rick Strahl’s Web Log (west-wind.com)

좋아요 3

@james.lee Clipboard 에 저장되어 있는 이미지 타입을 제대로 추론하지 못하는 거 같네요. @dimohy 제공해주신 글 잘 읽었습니다 ㅎㅎ

좋아요 2