2009-07-15 3 views
3

내 스마트 폰 용 맵 소프트웨어를 작성 중이므로 부분 만있을 때 (큰) 이미지 파일을 메모리에 모두로드하고 싶지 않은 문제가 발생했습니다. 표시됩니다.C#의 디스크에서 Bitmap 하위 섹션을 읽습니다.

x 및 y 오프셋 및 너비를 알고 있다면 큰 이미지의 하위 섹션 (볼 수있는 부분) 만 읽을 수 있습니까? 한 번에 한 바이트 씩 파일을 읽음으로써 아마도 그렇게 할 수 있을지는 모르지만 어떻게해야할지 모르겠습니다.

는 니코 감사

답변

2

당신의 이미지에 저장됩니다 어떤 형식 (들)에 부분적으로 적어도 의존하는 것입니다. 당신은 RAW 이미지 파일이나 비트 맵이 있다면, 그것은 가능할 수 있지만, 당신을 경우 데이터가 JPEG 또는 PNG와 같은 방식으로 압축되면 하위 섹션을 읽는 것이 훨씬 더 어려워 질 것입니다.

1

정말로 전체 데이터를 메모리에로드하고 싶지 않으면 파일을 읽는 사용자 고유의 IO 루틴을 작성해야합니다. BMP보다 복잡한 것이면 감압 알고리즘이 복잡해질 수 있습니다.

1

이미지를 미리 섹션으로자를 수 없습니까?

여러 개의 256x256 픽셀 이미지로 분할하면 두 개의 이미지를로드하고 볼 수있는 캔버스 위로 다시 스티칭해야합니다. 하나의 구현 이름을 짓기 위해 - Google지도는이 기술을 사용합니다. 그것은 BMP 파일이 있다면

+0

나는 이것이 올바른 해결책이라고 말할만큼 멀리 갈 것입니다. 이미지 크기를 양면에 2의 배수로 유지하십시오 (아마도 256x256 또는 512x512). –

+0

@ 280Z28 : 수정을위한 ta –

+0

이미 큰 이미지를 구성하는 256x256 청크가 있습니다. 그것들을 하나의 이미지로 합쳐서 gps지도 소프트웨어를 통해 올바른 위도/경도로 GPS지도로 변환 할 수있게했습니다. 위도와 경도를 사용하여로드 할 256x256 청크를 찾을 수있을 것 같습니다. 나는 수학에 대해 약간의 독서를해야 할 것입니다, 그것은 내가 처음에 GPS 소프트웨어에 그 비트를 위임 한 이유입니다 :) –

0

이 내가 비트 맵했던 뭔가 ...

public BitmapCropBitmap(BitMap fullBitmap, Rectangle rectangle) 
{ 
    return proBitmap.clone(fullBitmap, rectangle, fullBitmap.PixelFormat); 
} 
+0

먼저 전체 비트 맵을 로딩해야합니다. –

1

, 그 어렵지 않을 것이다.

먼저 파일에서 헤더를 읽습니다. 정확히 44 바이트를 기억하지만 웹에서 사양을 검색하는 것으로 확인할 수 있습니다.

헤더에는 픽셀 당 몇 바이트, 총 너비 및 높이, 스캔 라인 당 얼마나 많은 바이트 같은 정보가 들어 있습니다. 일반적으로 비트 맵은 거꾸로 저장되므로 파일의 어디에서 첫 번째 픽셀이 왔는지 계산하고 그 위치로 건너 뜁니다. 그런 다음 해당 라인에서 원하는 픽셀을 읽고 다음 라인의 올바른 픽셀로 건너 뜁니다.

FileStream 클래스에는 필요한 것이 있습니다. 판독을위한 방법은 Read이고 주어진 위치로 건너 뛰는 방법은 Seek이다.

+0

그러나 자원을 저장하고 싶지는 않습니다. 메모리가 제한된 장치 (또는 어쩌면)가 압축되지 않은 형식으로 저장됩니다. 공간 낭비이고 디스크/플래시에서로드하는 속도가 훨씬 느립니다. –

+0

모든 답변 주셔서 감사합니다! 나는이 접근법을 살펴볼 것이다. 기본적으로 나는 많은 256x256 청크에서 큰 이미지를 꿰매었다. 그런 다음 GPS 수신기에서 위도/경도 데이터를 가져 와서 화면에 표시 할 이미지 덩어리를 결정해야하는 문제가있었습니다. 이렇게하기 위해 작은 이미지를 하나의 큰 이미지에 꿰매 붙 였기 때문에 제 3의 파티 도구를 통해 실행할 수 있었기 때문에 정확한 점/길이 변환이 적용된 .map 파일을 만들 수있었습니다 (소수의 알려진 점으로 캘리브레이션 한 후). 나는 그다지 괴롭 히지 않을 것이다. 그러나 게으르지 만 ma –

+0

대신에 기존의 일부 맵을 사용하면 마지막 코멘트에 공간이 부족합니다. 모든 의견을 주셔서 감사합니다, 나는 작은 덩어리를 유지하려고합니다. 그러면 도전 과제는 gps 코드를 기반으로 사용할 코드를 결정하는 것입니다. lat/long에서 상상하는 픽셀로 일종의 변환을 써야 할 것입니다. –

관련 문제