2009-06-03 2 views
0

메모리를 할당하려고합니다. NSImage * originalLocationImage;700MB ~ 800MB의 메모리를 할당하려고합니다. 이미지 크기

NSURL * fileURL = [NSURL fileURLWithPath : originalLocation]; // originalLocation은 내 디스크의 파일 경로입니다.

originalLocationImage = [[NSImage alloc] initByReferencingURL : fileURL];

NSBitmapImageRep *sourceRep = [[NSBitmapImageRep alloc]initWithData:[SourceImage TIFFRepresentation]] //this line fails to allocate memory 

하고 큰 이미지 실패/

하고는 제대로 작동 작은 이미지에 대한 오류

malloc: *** mmap(size=268435456) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

가 발생합니다.

어떤 도움 ??

답변

1

왜 내가 처음부터 모든 이미지를 메모리에로드하려고하는지 궁금해합니다. 타일 세트와 같은 것이 더 나은 옵션 일 것입니다. 당신이 원하는 모든 미리보기의 경우이 많은 메모리 무료있을 수 있습니다 동안, 때문에이 메시지를 받고

, 당신은

+0

그 후 나는 그 이미지의 미리보기를 만들고 싶다. 그렇게하는 것이 더 좋은 방법 일 것이다. 나는 많은 것을 시도했지만 지금은 어떤 방법도 찾을 수 없었다. – ashish

1

무료이 많은 연속 메모리가없는 당신하여 라인을 읽을 수 모든 n 행을 건너 뛰고 각 행을 건너 뛸 때마다 n 픽셀 씩 건너 뜁니다. 필요한 경우 좀 더 정교한 스케일링 알고리즘을 통과 할 수있는 작은 이미지가 남았거나 미리보기 이미지 등으로 저장할 수 있습니다.

+0

제안 된 솔루션은 좋지만 압축 할 가능성이 높기 때문에 바이너리 스킵 입력을 할 수 없기 때문에 압축 해제 한 다음 압축 해제 된 출력에서 ​​데이터를 건너 뜁니다. – diciu

+0

예.하지만 청크로 압축을 풀 수 있습니다. 전체 이미지를 읽을 필요가 없습니다. – Blindy

2

libjpeg를 사용하는 것이 옵션 일 수 있으며 최대 16 : http://jpegclub.org/djpeg/까지 최적화 된 하위 배율을 수행 할 수 있습니다.

libjpeg는 일반 C이므로 Objective-C에서 호출 할 수 있습니다.

+0

이 코드 줄에 문제가 있습니다. 이미지 1 GB 크기의 psd를 사용해 보았습니다. NSBitmapImageRep * sourceRep = [[NSBitmapImageRep alloc] initWithData : [SourceImage TIFFRepresentation]] //이 줄은 메모리를 할당하지 못합니다. 이 경우 메모리를 할당하는 방법에 대한 제안. – ashish

+0

tiff 이미지를 얻는 중 추가 오류가 발생했습니다. : tiff 데이터 공급자 : 태그 값을 가져올 공간이 없습니다. – ashish

+0

코드의 동일한 클라인이 1 GB PSD 이미지를로드하는 경우 tiff가 아닌 이유는 무엇입니까? – ashish

0

이미지의 미리보기 만 만들고 싶다면 CGImageSource에 API가 있습니다. 그것들은 매우 처음이며 전체 이미지를 메모리로 읽어 들이지 않아도됩니다.

+0

이 클래스에 대해 이야기 할 때까지 아무 몸도 없습니다. 해상도와 크기가 다른 미리보기를 만들 수 있습니까? – ashish