2010-04-24 4 views
0

내 프로그램에는 작업 캔버스의 고해상도 이미지를 디스크로 내보내는 기능이 있습니다. 사용자는 자주 약 20,000 x 10,000 픽셀 @ 32bpp (약 800MB)의 이미지를 내보내려고합니다. 이를 평균 3D CAD 프로그램에서 이미 진행중인 심각한 메모리 소비량에 더하면 32 비트 플랫폼에서의 메모리 부족 충돌을 거의 보장 할 수 있습니다.거대한 이미지 만들기

그래서 이제 픽셀 편집기에서 사용자가 함께 스티치해야하는 1000x1000 픽셀의 타일을 내보내고 있습니다. 사용자가 작업을하지 않고도이 문제를 해결할 수있는 방법이 있습니까?

나는 프로세스에 명령 줄이 들어가고 자동으로 스티치를 수행하는 작은 exe를 작성할 수 있다고 생각했습니다. 그것은 별도의 프로세스가 될 것이므로 2GB의 RAM이 모두 자체적으로 필요합니다. 아니면 아직도 더 좋은 방법이 있습니까? jpg, png 및 bmp를 지원하여 이미지를 디스크에 바이트 스트림으로 쓰고 싶습니다. 당신이 언어 경합 적 다음은 두 가지 옵션이하고 싶은 경우

답변

1

는 :

  • 어느 쪽이든 당신이했던 것처럼 할 또는
  • 는 응용 프로그램을 수행 전문 그래픽으로 그것을한다. 그들은 이미지를 최대 해상도로 디스크에 보관하지만로드/저장하지 않을 때는 전체 이미지를 즉시로드/저장하지만 런타임에 타일 기반 접근 방식을 메모리에 만들고로드 만하면됩니다. 현재 관련성이있는 부분).

두 번째 aproach의 단점은 모든 것을 스스로 개발해야한다는 것입니다. OS 이미지 처리, 이미지 인코딩/디코더 또는 다른 어떤 것도 사용할 수 없습니다.

필자도 비슷한 문제가 있었지만 1/16bpp 만 사용하여 해결할 수있었습니다 (특히 이미지의 경우 32 비트는 일반적으로 메모리에 보관할 필요가없는 8 개의 완전히 사용되지 않는 비트 - 알파 채널). 이것은 제가 주로 1bpp 이미지의 레이어를 가지고 있음을 의미합니다. 그러나 이것은 이미지를 소비하기 위해 자신의 응용 프로그램을 사용하는 경우에만 분명히 작동합니다.

2

ImageMagick의 구성 요소는 composite입니다. 워드 프로세서는이 도구가 가능한 한 효율적으로 메모리를 만들 수 있는지 여부에 대해서는 아무 말도하지 않지만 알아내는 데 오랜 시간이 걸리지는 않습니다. 다운로드 페이지는 here입니다. IM은 모든 주요 플랫폼에서 사용할 수 있으며 많은 API와 인터페이스를 제공하며 독립 실행 형 EXE 또는 DLL로 사용되는 것으로 알고 있습니다.

복합체가 효과적이지 않으면 다른 도구가있을 것입니다. 압축되지 않은 이미지 데이터로 달성하는 것이 가장 쉽습니다. 4 개의 JPEG를 모두 메모리에 두지 않고 함께 스티칭하는 방법은 생각할 수 없습니다 (이미 완료 되었음에도 불구하고).

+0

감사합니다. Pekka, 복합 기능을 확인해 보겠습니다. 설치 프로그램에서 ImageMagick을 제공 할 수 없으므로 해당 기능을 직접 사용하고 있습니다. –

+0

@ David 환영합니다. 그러나 외부 DLL을 배송 할 수없는 경우에는 지능적인 스티칭/스와핑 솔루션을 사용해야합니다. 나는 최소한의 영감을 얻으려면 좋은 소스 코드가있는 오픈 소스 stitchers가 있다고 확신한다. –

+0

자동으로 실행되는 소형 콘솔 앱을 작성했습니다. 너무 오래 걸리지는 않았지만 여전히 32 비트 OS에서 2GB의 비 압축 이미지 데이터로 제한됩니다. 아직도, 나는 그것이 대부분의 사용을 위해 잘되어야한다고 생각한다. –