2010-06-30 10 views
19

Io uso il seguente codice per ottenere immagini dallo sprite. E funziona bene ovunque tranne l'iPhone 4 (versione HD).Come utilizzare CGImageCreateWithImageInRect per iPhone 4 (HD)?

- (UIImage *)croppedImage:(CGRect)rect { 
    CGImageRef image = CGImageCreateWithImageInRect([self CGImage], rect); 
    UIImage *result = [UIImage imageWithCGImage:image]; 
    CGImageRelease(image); 
    return result; 
} 

L'iPhone 4 caricare automaticamente la versione HD dell'immagine ([email protected]) invece Sprite. L'immagine originale ha una scala 2, ma l'immagine risultante ha una scala 1 e una dimensione sbagliata.

Come gestire questo comportamento tenendo conto delle diverse scale per iPhone 3G [s] e iPhone 4?

Ho letto questo document, ma circa l'uso CGImageCreateWithImageInRect qui non dice nulla.

+0

Sarei molto interessato se potessi guardare la mia risposta. Sono sicuro che c'è un modo migliore per ottenere ciò che vogliamo. Ma la risposta corretta qui mi sembra non al punto. Potresti usare il codice sopra + la traduzione rect con scala e vedere se funziona? – Daniel

risposta

32

Da quello che posso dire, CGImageCreateWithImageInRect farà la cosa giusta. Quello che dovete cambiare è l'UIImage initilization

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/occ/clm/UIImage/imageWithCGImage:scale:orientation:

Change a [UIImage imageWithCGImage:image scale:self.scale orientation:self. imageOrientation] e dovrebbe funzionare bene. (ciò presuppone che si tratti di una categoria su UIImage che sembra sia)

+3

Grazie. Ho perso questa funzione. Inoltre, ho bisogno di moltiplicare immagine sorgente rect da self.scale. – Victor

+2

Grazie. Questo mi ha permesso di risparmiare ore :-) Inoltre: avevo bisogno di moltiplicare il fattore di scala per le mie dimensioni del raccolto per rendere il risultato un aspetto corretto. – esbenr

+1

Sì moltiplicare il rect sembra essere una soluzione alternativa per qualcosa che dovrebbe semplicemente "fare la cosa giusta". La chiave è la scala, non questo metodo menzionato nella risposta. – Daniel

14

È necessario moltiplicare il prezzo di ritaglio in base alla scala dell'immagine. Dalla mia esperienza, non è necessario utilizzare alcuna inizializzazione dell'immagine diversa.

- (UIImage *)_cropImage:(UIImage *)image withRect:(CGRect)cropRect 
{ 
    cropRect = CGRectMake(cropRect.origin.x * image.scale, 
          cropRect.origin.y * image.scale, 
          cropRect.size.width * image.scale, 
          cropRect.size.height * image.scale); 

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect); 

    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 

    return croppedImage; 
} 
+0

Trovo che funzioni e quanto sopra non lo è. Probabilmente Apple sta cambiando le implementazioni ... –

+0

Non funziona a partire da settembre 2016 – joey

Problemi correlati