2013-05-02 2 views
4

나는 응용 프로그램에서 사용할 매우 큰 고해상도지도가 있습니다 (이미지 크기는 약 80MB).매우 큰 TIFF 파일 확대/축소

나는 다음 알고 싶다 :

  • 는 어떻게하면이 이미지를 가능한 한 최선의 방법을로드 할 수 있습니다? 이미지를로드하는 데 몇 초가 걸릴 것이라고 (나는 괜찮습니다)하지만 진행 상황을 사용자에게 알리고 싶습니다. 결정된 모드를 사용하여 사용자에게 JProgressBar의 일종으로 표시하고 싶습니다. 이것은로드 된 바이트 수 또는 그와 비슷한 것을 반영해야합니다. 이 기능을 제공 할 수있는 이미지로드 방법이 있습니까 (예 : ImageIO.read())?
  • 지도가 매우 고해상도이므로 사용자가 스크롤하여 확대/축소 할 수 있도록하고 싶습니다. 가장 좋은 방법은 무엇입니까? 나는 표준 크기로 BufferedImage 크기를 재조정하면 큰 파일에 아주 오랜 시간이 걸린다는 사실을 안다. 이 작업을 수행하는 효율적인 방법이 있습니까?

입력 해 주셔서 감사합니다.

종류와 관련,
헥터 반 덴 Boorn

추신 이미지는 JPanel의 캔버스에 그려집니다.


안녕하세요, 귀하의 도움에 감사드립니다. 모든 것이 완벽하게 작동하고 빠르게로드됩니다. 귀하의 전문 지식과 설명이 없으면 나는 여전히 이것을 위해 노력해 왔을 것이므로 현상금을 공정하고 사각으로 받았습니다.

내가 한 것은 다음과 같습니다. imagemagick을 사용하여 다른 해상도의 여러 이미지를 만들었고 실행 시작시 가장 작은 res 만로드합니다. 영상. 나머지는 별도의 스레드에로드되어 실행이 중단되지 않습니다. 내가 제공 한 정보를 사용하여 확대하거나 축소 할 때 적절한 이미지를 사용합니다. 타일을 사용하는 것에 다소 회의적입니다. 왜냐하면지도 위에 직접 이미지를 그려야하고 외부 항아리에서 페인트 기능을 사용할 수 없다는 것을 알았 기 때문에 사용법이 간단 해졌습니다. rescale 모드가 확대/축소 또는 패닝이 빠름으로 설정되어 있고 확대/축소 또는 패닝하지 않을 때 rescale은 픽셀 완전 이미지의 경우 부드럽게 설정되어 있지만 (제안 된 것처럼) 충분히 빠르며, 타일이 필요합니다. (이보다 더 큰 이미지를 사용하는 경우이 작업이 필요하고 필자가 제공 한 정보를 이해할 수 있습니다.)

다시 감사 그래서 모든 것이 완벽하게 작동됩니다 :)

+0

표시해야 할 사각형을 추적하고 뷰어의 이미지 일부를 선택하는 옵션이 있습니까? 이미지를 패닝 (예 : 왼쪽으로 이미지 이동) 할 때이 기능은 어떻게 작동합니까? –

답변

2

는 두 가지 방법이 있습니다 당신이 (동시에)해야 :

  1. 다양한 크기로 이미지를 다운 스케일링. 이미지의 해상도가 가장 높을 때까지 1/2, 1/4, 1/8 등의 낮은 해상도로 이미지의 크기를 줄여야합니다. 사용자가 처음 이미지를 열면 더 낮은 해상도의 이미지가 표시됩니다. 이렇게하면 빠르게 로딩되어 사용자가 이동할 수 있습니다. 사용자가 확대하면 더 높은 해상도의 이미지를 사용합니다. 당신은 이것을 위해 ImageMagick을 사용할 수 있습니다 : http://www.imagemagick.org/Usage/resize/
  2. 타일 큰 이미지. 이렇게하면 하나의 큰 이미지를 격자 패턴의 많은 수의 작은 이미지로 분해 할 수 있습니다. 사용자가 영역을 확대하면 사용자가보고있는 타일을 계산하고 이미지의 다른 영역이 아닌 해당 영역 만 렌더링합니다.ImageMagick을 사용하여 이미지를 타일로 분할 할 수 있습니다 (예 : ImageMagick. What is the correct way to dice an image into sub-tiles). 문서는

http://www.imagemagick.org/Usage/crop/#crop_tile 일단

을 (너무 빨리 렌더링, 아직 믿을 수 없을만큼 높은 해상도로지도를 확대하기 위해 적절한 크기의 타일 이미지의 캐시에서 GoogleEarth 수많은 다른 매핑 응용 프로그램을 허용 무엇 제공)입니다 당신이 당신의 타일을 가지고, 당신은 자바에서 여러 가지 엔진 중 하나를 사용할 수 있습니다

다른 것들도있을 수 있습니다.

이 프레임 워크 내에서 임의의 확대/축소 (핀치 확대/축소 또는 유사)를 구현할 수 있습니다. 가장 가까운 높은 해상도 캐시를 선택, 사용자가 선택한 줌 레벨에 대한

  1. : 당신이 할 수 줌 범위 내에서, 알고리즘 같은 것을 할 것이다. 예를 들어 100 %, 50 %, 25 % 및 12.5 % 타일이 있고 사용자가 33 % 확대/축소를 선택한 경우 50 % 타일을 선택하십시오.
  2. 타일 사각형을 올바른 사각형 크기로 설정하십시오. 선택한 줌 (가장 낮은 줌 레벨에서 단일 타일 일 수 있음). 예를 들어 타일이 100 픽셀 인 50 % 타일을 사용하는 33 % 줌에서 그리드는 67 픽셀 제곱입니다
  3. 타일 이미지를 화면에 맞게 개별적으로로드하고 비율을 조정합니다 (이 방법은 작동하는 멀티 스레드 일 수 있습니다 잘

) 현대 CPU 아키텍처에 점 몇 가지주의 할 수 있습니다

  1. scaling algorithm 변화는 당신이 타일이 가장 큰 해상도에 도달하면.
    1. 이미지를 최대 100 % 확대/축소하고 이중선 또는 바이 큐빅 배율을 사용하십시오. 이
    2. 100 % 이상 작은 들쭉날쭉와 사진에 대한 뛰어난 외관을 제공합니다, 당신은 아마 픽셀을 보여주고 싶은, 그래서 가장 가까운 이웃은 더 높은 규모 타일 및 저소득층을 사용, 높은 충실도를위한 좋은 선택
  2. 수 있습니다 > 50 %. 예를 들어 타일을 100 %, 50 %, 25 % 및 12.5 %로 준비했다고 가정합니다. 40 % 확대/축소를 표시하려면 50 % 타일을 축소하지 마십시오. 대신 100 % 타일을 사용하고 40 %까지 크기를 조정하십시오. 유용합니다.
    1. 이미지가 텍스트 또는 다이어그램 (즉, 많은 직선이 포함 된 래스터 이미지) 인 경우. 당신이 사진 스타일의 이미지
  3. 을 매우 높은 충실도를해야 할 경우
  4. 을 오버 샘플링하지 않는 경우가 잠시 예를 들어 줌의 미리보기 (렌더링해야하는 경우 이미지의 이러한 유형은 종종 불쾌한 공예품을 생산합니다 확장 사용자가 여전히 꼬집고 - 줌), 제스처의 시작 부분에서 스크린 샷을 잡고 확대/축소합니다. 확대/축소 미리보기가 픽셀 단위로 완벽하다는 것보다 애니메이션이 매끄럽다는 점이 훨씬 중요합니다.
  5. 올바른 크기의 타일을 선택하는 것이 중요합니다.매우 큰 타일 (화면 당 <)은 렌더링 속도가 느립니다. 타일이 너무 작 으면 다른 오버 헤드가 생기며 화면이 무작위로 채워지는 곳에서 종종 불쾌한 렌더링 공예품이 생성됩니다. 성능과 복잡성 간의 좋은 절충안은 타일을 전체 화면 크기의 약 1/4로 만드는 것입니다. 이러한 기술을 사용하는 경우

는 이미지가 매우 빠르게로드해야합니다 그래서 진행률 표시 줄이 그렇게 중요하지 않습니다. 이 경우, 당신은 ImageReader에 된 IIOReadProgressListener를 등록해야합니다 JavaDoc을에서

:

자신의 이미지의 발신자를 통지하는 ImageReader 구현으로 사용되는 인터페이스 및 진행 과정의 미리보기 읽기 방법.

이 인터페이스는 imageProgress 및 thumbnailProgress 메서드를 통해 진행 상황을 디코딩하는 일반적인 표시와 전체 이미지가 imageStarted, imageComplete, thumbnailStarted 및 thumbnailComplete 메서드를 통해 업데이트되었을 때를 나타내는 이벤트를받습니다. 픽셀 갱신이 발생했을 때 (예를 들어, 점진적 디코딩 중에) 통지 받고자하는 응용 프로그램은 IIOReadUpdateListener를 제공해야합니다.

+0

안녕하세요, 귀하의 회신에 감사드립니다. 내가 올바르게 이해하면 각 확대/축소 수준마다 다른지도 (해상도가 다름)가 있고 각지도를 바둑판 식으로 배열해야합니까? 따라서 가장 확대 된지도의 경우 예를 들어 모든 것을 포함하는 1 타일, 가장 확대 된지도에 대해 예를 들어 100 개의 타일? –

+0

@ HéctorvandenBoorn : 당신은 기본적으로 정확 합니다만, 임의의 확대/축소를 구현하는 접근법이 있습니다 - 이것을 구현하는 방법에 대한 자세한 답변을 추가했습니다. 이 기능을 실제로 볼 수있는 가장 좋은 방법은 Google 어스입니다. 이것은 모바일 브라우저가 구현되는 방식이기도합니다 (iPhone과 Android 모두). 대형 페이지에서 브라우저를 열심히 사용하면 브라우저가 해당 영역을 렌더링하기 전에 잠시 동안 큰 사각 간격을 볼 수 있습니다. –

+0

안녕하세요 앤드류, 정말 고마워요. 모든 것이 완벽하게 작동하고 빠르게로드됩니다. –