2013-06-18 3 views
3

나는 애니메이션 GIF를 NSData 또는 NSBitmapImageRep 개체에로드했습니다. Reference for NSBitmapImageRep애니메이션 GIF의 프레임에 액세스하는 방법

은 내가 사용하여 해당 GIF의 프레임 번호와 같은 데이터를 반환하는 방법을 냈어요 : 난 사실 자체로 그 프레임에 액세스 할 수있는 방법에 관한

NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"]; 

는 그러나, 나는 조금 혼란 스러워요 목적.

나는이 두 가지 방법 중 하나가 도움이 될 것이라고 생각하지만 실제로 어떻게 그들이 나를 위해 개별 프레임을 얻을지 확신하지는 않습니다.

+ representationOfImageRepsInArray:usingType:properties: 
– representationUsingType:properties: 

도움을 주시면 감사하겠습니다. 감사합니다

답변

5

은 내가 사용하여 해당 GIF의 프레임 번호와 같은 데이터를 반환하는 방법을 냈어요 : 나는 실제로 그 프레임에 액세스 할 수있는 방법에 관한

NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"]; 

는 그러나, 나는 조금 혼란 스러워요 그 자신의 개체.

당신 만 NSImageCurrentFrame을 설정해야 작업이 완료되는 특별한 프레임 indexOfFrame ( 0 <= indexOfFrame < [frames intValue])에 액세스합니다. CG 기능을 사용하거나 프레임을 복사 할 필요가 없습니다. 당신은 객체 지향 코코아 세계에 머물 수 있습니다.

NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"]; 
if(frames!=nil){ // bitmapRep is a Gif imageRep 
    for(NSUInteger i=0; i<[frames intValue]; i++){ 
     [bitmapRep setProperty:NSImageCurrentFrame 
        withValue:[NSNumber numberWithUnsignedInt:i] ]; 
     NSLog(@"%2d duration=%@", 
       i, [bitmapRep valueForProperty:NSImageCurrentFrameDuration]); 
    } 
} 

는 또 다른 예 :

NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"]; 
if(frames!=nil){ // bitmapRep is a Gif imageRep 
    for(NSUInteger i=0; i<[frames intValue]; i++){ 
     [bitmapRep setProperty:NSImageCurrentFrame 
        withValue:[NSNumber numberWithUnsignedInt:i] ]; 
     NSData *repData = [bitmapRep representationUsingType:NSPNGFileType 
               properties:nil]; 
     [repData writeToFile: 
      [NSString stringWithFormat:@"/tmp/gif_%02d.png", i ] atomically:YES]; 
    } 
} 
: 파일 시스템에 PNG 파일로 GIF 이미지의 모든 프레임을 쓰기 작은 예는 모든 GIF 프레임의 지속 시간을 보여줍니다
2

내가 사용하여 해당 GIF의 프레임 번호와 같은 데이터를 반환하는 방법을 생각했습니다 그러나

NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"]; 

, 나는 실제로 그 프레임에 액세스 할 수있는 방법에 관해서는 조금 혼란 스러워요 그것의 자신의 목표.

내가 아는 한 NSBitmapImageRep을 사용할 수 없습니다.

대신 GIF 데이터에서 CGImageSource를 만들고 CGImageSourceCreateImageAtIndex을 사용하여 각 프레임을 추출하십시오.

settingNSImageCurrentFrame 속성을 사용해보십시오. 각 프레임에 담당자가 필요한 경우 프레임이있는만큼 복사본을 만들고 (원본이 있기 때문에 1을 뺀 것) 각 담당자의 현재 프레임을 다른 번호로 설정하십시오. 그러나 나는 그것을 시도하지 않았기 때문에 그것이 실제로 효과가 있을지 확신하지 못합니다.

기본적으로 NSBitmapImageRep의 GIF 지원이 이상하므로 CGImageSource 만 사용해야합니다.

나는이 두 가지 방법 중 하나가 도움이 될 것이라고 생각하지만 실제로 어떻게 그들이 나를 위해 개별 프레임을 얻을지 확신하지 못합니다.

+ representationOfImageRepsInArray:usingType:properties: 
– representationUsingType:properties: 

없음, 이러한 방법은 화상 (또는 화상 담당자)를 직렬화하기위한 것이다. 데이터를 쓰지 않고 데이터를 쓰는 것이지요. (해당 메소드가 상수 인 type 매개 변수에 무엇이 있는지 확인하십시오.)

1

iOS 용 GIF 디코더의 작동 소스 코드를보고 싶다면 MacOSX에서도) AVGIF89A2MvidResourceLoader.m at github을 찾을 수 있습니다. 접근 방법은 ImageIO 프레임 워크를 사용하고 CGImageSourceCreateWithData()를 CGImageSourceCreateImageAtIndex()와 함께 호출하여 파일의 N 번째 gif 이미지에 액세스하는 것입니다. 그러나 투명 픽셀이 GIF에 나타나는지 감지하는 것과 관련된 몇 가지 까다로운 세부 사항과 GIF가 너무 길어서 분명하지 않을 수도있는 메모리 부족 현상을 피하기 위해 결과를 파일에 쓰는 방법과 관련되어 있습니다.