2010-06-30 9 views
19

Ich verwende den folgenden Code zum Abrufen von Bildern aus dem Sprite. Und es funktioniert überall gut außer dem iPhone 4 (HD-Version).Wie verwende ich CGImageCreateWithImageInRect für iPhone 4 (HD)?

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

Das iPhone 4 automatisch HD-Version des Bildes ([email protected]) statt sprite.png laden. Das ursprüngliche Bild hat eine Skala 2, aber das resultierende Bild hat eine Skala 1 und eine falsche Größe.

Wie behandelt man dieses Verhalten unter Berücksichtigung der verschiedenen Skalen für das iPhone 3G [s] und das iPhone 4?

Ich habe diese document gelesen, aber über die Verwendung CGImageCreateWithImageInRect hier sagt nichts.

+0

Ich wäre sehr interessiert, wenn Sie meine Antwort sehen könnten. Ich bin sicher, dass es einen besseren Weg gibt, um das zu erreichen, was wir wollen. Aber die richtige Antwort hier scheint mir nicht auf den Punkt zu kommen. Könnten Sie den Code über + die richtige Übersetzung mit Maßstab verwenden und sehen, ob es funktioniert? – Daniel

Antwort

32

Von was ich sagen kann das CGImageCreateWithImageInRect wird das Richtige tun. Was Sie brauchen, ist die UIImage ändern initilization

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

ändern es zu [UIImage imageWithCGImage:image scale:self.scale orientation:self. imageOrientation] und es sollte gut funktionieren. (Angenommen, das ist eine Kategorie auf UIImage, die aussieht wie sie ist)

+3

Danke. Ich habe diese Funktion verpasst. Auch muss ich Quellbild rect von self.scale multiplizieren. – Victor

+2

Danke. Das hat mir Stunden gespart :-) Außerdem: Ich musste den Maßstabsfaktor auf meine Schnittdatensätze multiplizieren, damit das Ergebnis richtig aussieht. – esbenr

+1

Ja multipliziert das Rect scheint eine seltsame Problemumgehung für etwas, das nur "das Richtige tun" sollte. Der Schlüssel ist die Skala, nicht diese Methode in der Antwort erwähnt. – Daniel

14

Sie sollten die Schnitt-Rect mit dem Bildmaßstab multiplizieren. Aus meiner Erfahrung ist es unnötig, eine andere Bildinitialisierung zu verwenden.

- (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

Ich finde das funktioniert und das obige nicht. Wahrscheinlich ändert Apple Implementierungen ... –

+0

Funktioniert nicht ab September 2016 – joey