Menu ▾ ▴

#70 이미지 배경 제거 기능 추가

closed
nobody
None
2026-10-15
2026-10-14
Anonymous
No

Originally created by: SeoJCalive
Originally owned by: KnifeLemon

무엇이 바뀌나요?

배경 제거를 추가합니다. 단색 배경(서명·도장 뒤의 종이, 로고 배경)을 투명하게 만드는 이미지 옵션과 내장 PNG 프리셋입니다. Magick.NET만 사용해 오프라인으로 동작합니다. Fixes [#69]

  • BackgroundRemover: 테두리 중앙값으로 배경색을 정하고, 밝은 종이는 구역별로 다시 추정해 조명 차이를 보정합니다. 색-투명도 분리로 가장자리를 흰 테두리 없이 매끄럽게 처리하고, 외딴 노이즈 점을 지우며, "안쪽 영역 유지" 옵션을 지원합니다.
  • ImageOptions: RemoveBackground, BackgroundTolerance(0~100, 기본 25), KeepEnclosedBackground를 추가했습니다. ImageEncoder.ApplyOptions에서 흑백 변환과 투명 영역 채우기보다 먼저 적용되므로, JPG로 저장하면 지운 배경이 배경색으로 채워집니다.
  • 프리셋 편집 화면: 체크박스, 허용 범위 슬라이더, "안쪽 영역 유지"
  • 내장 remove-background 프리셋(출력 이름 {name}_transparent): 기본 원형 메뉴에는 올리지 않습니다(필요하면 설정 → 원형 툴바에서 추가). 기존 사용자에게는 설정 스키마 10에서 프리셋만 추가합니다.

어떻게 테스트했나요?

  • [x] dotnet format --verify-no-changes
  • [x] dotnet test (추가: 엔진 13개, 마이그레이션 1개, 프리셋 편집 화면 렌더 1개)
  • [x] 앱에서 직접 확인 (Windows): 휴대폰으로 찍은 서명 사진을 배경 제거 프리셋으로 변환해, 가장자리가 깔끔한 투명 PNG를 얻었습니다.

스크린샷

image

HelloWorld
HelloWorld_transparent

체크리스트

  • [x] 새 UI 문구를 src/Filee.App/Assets/i18n/*.json 세 파일 모두에 추가했습니다.
  • [x] 새 외부 코드나 바이너리는 없습니다 (THIRD-PARTY-NOTICES.md 변경 없음).

Related

Tickets: #69
Tickets: #75

Discussion

  • Anonymous

    Anonymous - 2026-10-15
     
  • Anonymous

    Anonymous - 2026-10-15

    Originally posted by: KnifeLemon

    감사합니다!

    [#71] 에서 말씀드린 대로 이 프리셋은 기본 이미지 도넛에서만 빼 주실 수 있을까요?
    기본 프리셋과, 기존 사용자에게 프리셋을 추가해 주는 스키마 10 마이그레이션은 그대로 두고, "images" 프로필에 올리는 Offer(...) 부분만 빼 주시면 돼요.

    렌더 테스트도 슬라이스 8개로 되돌려 주세요.

    출력 이름 {name}_transparent는 좋습니다.

    나머지 코드는 그동안 제가 살펴볼게요.

     

    Related

    Tickets: #71

  • Anonymous

    Anonymous - 2026-10-15

    Originally posted by: SeoJCalive

    리뷰 감사합니다!
    말씀하신 대로 수정했습니다 (6226879).

    1. 기본 이미지 도넛("images" 프로필)에서 remove-background를 뺐습니다.
    2. 스키마 10 마이그레이션은 프리셋 추가만 하고, Offer(...) 부분은 지웠습니다.
    3. 렌더 테스트는 슬라이스 8개로 되돌렸습니다.
    4. 마이그레이션 테스트도 "어느 도넛에도 올라가지 않는지" 확인하도록 바꿨습니다.

    이후 기능을 추가하면 같은 방식으로하겠습니다!
    추가 수정 사항있으면 말씀해주세요!

     
  • Anonymous

    Anonymous - 2026-10-15

    Ticket changed by: KnifeLemon

    • status: open --> closed
     
  • Anonymous

    Anonymous - 2026-10-15

    Originally posted by: KnifeLemon

    수정 감사합니다! 코드를 살펴보다 고칠 점이 몇 가지 있어서, 시간 아끼시라고 제가 직접 이 브랜치에 커밋을 올렸어요(cde6b44).
    확인해 보시고 이상한 점 있으면 말씀해 주세요.

    before_after

    • 투명 PNG 로고가 가장자리에 닿으면 로고 색을 배경으로 잡아서 결과가 완전히 비던 문제 → 가장자리의 절반 이상이 불투명할 때만 처리해요.
    • 이미 투명한 픽셀(0,0,0,0)이 검은 잉크로 계산돼서 [#555555] 선이 반투명 검정이 되던 문제 → 투명 픽셀은 지운 배경으로 봐요.
    • "안쪽 영역 유지"가 잉크 가장자리까지 원본으로 되돌리던 문제 → 둘러싸인 배경만 원래 색으로 남겨요.
    • 메모리: 결과를 픽셀 배열에 바로 쓰고 불투명도를 byte로 저장해서, 48MP 기준 551MB → 230MB, 5.3초 → 3.2초가 됐어요. GetPixels()도 using으로 해제했어요.
    • 연한 회색 면(#D0D0D0)이 그늘진 종이로 잡히지 않도록 기준을 조정했고, 안내 문구에 회색 면과 가장자리 색 이야기를 추가했어요.
    • 32px보다 작은 이미지는 잡티 제거를 건너뛰어요.
    • 위 경우들에 대한 테스트 5개를 추가했어요.

    좋은 기능 만들어 주셔서 감사합니다!

     

Log in to post a comment.