2012-03-21 19 views
6

W iOS, aby zapisać UIImage jako JPEG, używam UIImageJPEGRepresentation, jednak nie biorą one opcji innych niż kompresja. Chciałbym zapisać format UIImage w formacie progressive JPEG, czy istnieje prosty sposób na zrobienie tego?Jak zapisać UIImage w progresywnym formacie JPEG w systemie iOS?

Wygląda na to, że w OS X dostępna jest opcja NSImageProgressive, aby zapisać NSImage w formacie progresywnym.

+0

próbowałaś 'UIImageJPEGRepresentation (<# UIImage * zdjęcie #>, <# CGFloat compressionQuality #>) ' – hchouhan02

+0

To nie czyni go progresywnym. –

Odpowiedz

7

myślę, że można to zrobić za pomocą ramy ImageIO, tak:

#import <UIKit/UIKit.h> 
#import <ImageIO/ImageIO.h> 
#import <MobileCoreServices/MobileCoreServices.h> 
#import "AppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     UIImage *sourceImage = [UIImage imageNamed:@"test.jpg"]; 

     CFURLRef url = CFURLCreateWithString(NULL, CFSTR("file:///tmp/progressive.jpg"), NULL); 
     CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL); 
     CFRelease(url); 

     NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
      (__bridge id)kCFBooleanTrue, kCGImagePropertyJFIFIsProgressive, 
      nil]; 

     NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys: 
      [NSNumber numberWithFloat:.6], kCGImageDestinationLossyCompressionQuality, 
      jfifProperties, kCGImagePropertyJFIFDictionary, 
      nil]; 

     CGImageDestinationAddImage(destination, sourceImage.CGImage, (__bridge CFDictionaryRef)properties); 
     CGImageDestinationFinalize(destination); 
     CFRelease(destination); 

     return 0; 
    } 
} 

Preview.app mówi plik wyjściowy jest progresywny, a identify polecenia ImageMagick mówi, że ma „przeplotu: JPEG”.

+0

Mam test na urządzeniu z iOS i jestem innym symulatorem formularzy. – user501836

+0

Wynik jest taki sam jak w przypadku http://stackoverflow.com/questions/10829100/creating-progressive-jpeg-on-ios-z-imageio-produces-blocky-results-on-device – user501836

0

Ten kod działa na urządzeniu - kluczem jest określić wszystkie wartości gęstości (zanotuj jego użyciu nowej składni dosłowne):

- (UIImage *)imager 
{ 
    UIImage *object = [UIImage imageNamed:@"Untitled.jpg"]; 
    NSString *str = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Tester.jpg"]; 
    NSURL *url = [[NSURL alloc] initFileURLWithPath:str]; 

    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, kUTTypeJPEG, 1, NULL); 

    NSDictionary *jfifProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
            @72, kCGImagePropertyJFIFXDensity, 
            @72, kCGImagePropertyJFIFYDensity, 
            @1, kCGImagePropertyJFIFDensityUnit, 
            nil]; 

    NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithFloat:.5f], kCGImageDestinationLossyCompressionQuality, 
           jfifProperties, kCGImagePropertyJFIFDictionary, 
           nil]; 

    CGImageDestinationAddImage(destination, ((UIImage*)object).CGImage, (__bridge CFDictionaryRef)properties); 
    CGImageDestinationFinalize(destination); 
    CFRelease(destination); 

    return [UIImage imageWithContentsOfFile:str]; 
} 
+0

Nie należy '(__bridge id) kCFBooleanTrue, kCGImagePropertyJFIFIsProgressive' będzie częścią 'jfifProperties'? Musiałem to dodać, aby faktycznie zapisać to jako obraz progresywny. – qix

+0

@Linus, kiedy odpowiedziałem na to pytanie albo to przegapiłem, albo nie było takiej własności. Najwyraźniej ta odpowiedź nikomu nie przydała się z pewnością, nie był to oryginalny plakat, więc chciałbym zobaczyć, co tu jest z podejrzeniem (chociaż oczywiście jestem pewien, że jest poprawne, a ja bym tego nie opublikował :-)) –

Powiązane problemy