2012-01-12 5 views
2

현재 다음 코드를 사용하여 iOS 응용 프로그램의 ALAsset에서 UIImage를 가져옵니다.CGImageRef의 최대 크기를 ALAssetRepresentation에서 설정하십시오.

ALAssetRepresentation *rep = [self.asset defaultRepresentation]; 
CGImageRef ref = [rep fullResolutionImage]; 
ALAssetOrientation orientation = [[self.asset valueForProperty:@"ALAssetPropertyOrientation"] intValue]; 
UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:(UIImageOrientation)orientation]; 

이미지가 상당히 작 으면 (예 : 장치의 카메라로 촬영 한 경우) 매우 잘 작동합니다. 이미지 (6000px^2 등) 너무 큰 그러나 경우 앱이이 단계에서 메모리가 부족합니다

CGImageRef ref = [rep fullResolutionImage]; 

내가 응용 프로그램이 충돌하기 전에이 상태를 감지하거나 싶습니다 (이상적) 설정 돌려 주어지는 이미지의 최대 사이즈

저는 fullScreenImage이 더 작은 이미지를 반환 하겠지만, 확대/축소를 위해 이미지에서 훨씬 높은 해상도가 필요하다는 것을 알고 있습니다.

JPG와 같이 압축률이 높은 형식은 압축 된 크기가 작지만 픽셀 단위로 크기가 크면 메모리가 너무 많이 소모 될 수 있으므로 자산의 바이트 크기를 사용하면 신뢰할 수 없습니다 (낮은 세부 이미지, 압축률이 높은 이미지).

이미지의 크기를 가져 와서이 상황을 미리 감지하여로드를 취소하고 오류를 표시하거나 큰 자산의 작은 버전을 얻는 방법에 대한 정보는 크게 감사하겠습니다.

답변

2

업데이트 :

의견에서 일부 토론 후.

당신은 전화

[asset metadata] 

내가 찾은 참조하여 파일/자산의 Exif 정보를 얻을 수는 페이지는 개별 속성을 가져 오는 방법을 보여줍니다 여기 sarofox.alasset-image-metadata 입니다. 파일/자산을 열기 전에 픽셀 크기를 가져와야합니다.

MY OLD 답변 :

는 경우 중 하나가 도움 아이디어 :

이것은 단지 추측을 발견, 다음과 같습니다. 하지만 사용할 수는 없습니까? ALAssetRepresentation getBytes:fromOffset:length:error:

장치 카메라의 이미지를 기대하는 바이트 크기를 사용하십시오.

파일의 파일 크기 시작 부분부터 fromOffset을 사용하여 검사를 실행하십시오. 그리고 파일 크기의 (원하는 최대) 끝에 길이.

버퍼의 크기를 읽습니다. 그것이 요청보다 작 으면 당신은 괜찮습니다. 정확히 다음 파일에 더 남아있을 수 있습니다 요청 범위 같은 경우 가 (. 그것은 어쩌면 더 큰)

그렇다면, getBytes의 새로운 요청을 실행 fromOffset을 : 길이 : 오류 :를 *이 마지막 요청의 길이와 새로운 길이로부터 fromOffset을 가진 시간.

그런 다음 결과를 추가하고 전체 파일이 너무 커지 여부를 결정할 수 있습니다.

너무 큰 버퍼/파일이 없습니다.

+0

감사합니다. 문제는 압축 된 이미지의 파일 크기가 부적절하다는 것입니다. 예를 들어, 흰색 만 포함 된 6000px * 6000px의 PNG는 바이트 크기가 매우 작지만보기 위해 압축되지 않으면 매우 커집니다. – 0x90

+0

투영 된 픽셀 크기를 얻으려고하므로 – markhunte

+0

예. 이 질문을 명확하게하기 위해 업데이트했습니다. 그것을 지적 주셔서 감사합니다. :) – 0x90