2010-07-13 8 views
4

J'ai un problème avec un code simple. Les photos, prises ou prises avec l'appareil photo, sont pivotées. Au début, je pensais que c'était un paramètre dans le UIView mais il arrive quand je copie le passé dans UIImage à un autre UIImage en utilisant CGImageRef. Je l'ai fait de cette façon car c'était le moyen le plus simple de m'assurer que j'utilisais une copie. Corrigez ce code si j'ai foiré s'il vous plait.CGImageRef à UIImage tourne mes photos débogage sur un iOS 4 dans un simulateur ou un appareil

Le code:

- (id)initWithImage:(UIImage *)image { 
    if ((self = [super init]) && (image != nil)) { 
     CGImageRef tmpImageRef = [image CGImage]; 
     puzzle = [[UIImage alloc] initWithCGImage:tmpImageRef]; 
    } 

    return self; 
} 

Le débogueur:

This GDB was configured as "--host=i386-apple-darwin --target=arm-apple-darwin".tty /dev/ttys001 
Loading program into debugger… 
sharedlibrary apply-load-rules all 
Program loaded. 
target remote-mobile /tmp/.XcodeGDBRemote-25694-49 
Switching to remote-macosx protocol 
mem 0x1000 0x3fffffff cache 
mem 0x40000000 0xffffffff none 
mem 0x00000000 0x0fff none 
run 
Running… 
[Switching to thread 11523] 
[Switching to thread 11523] 
Re-enabling shared library breakpoint 1 
Re-enabling shared library breakpoint 2 
continue 
2010-07-13 15:09:17.159 Golovomka[693:307] Using two-stage rotation animation. To use the smoother single-stage animation, this application must remove two-stage method implementations. 
2010-07-13 15:09:17.172 Golovomka[693:307] Using two-stage rotation animation is not supported when rotating more than one view controller or view controllers not the window delegate 
Current language: auto; currently objective-c 
(gdb) print (CGSize)[image size] 
$1 = { 
    width = 1536, 
    height = 2048 
} 
(gdb) n 
28     puzzle = [[UIImage alloc] initWithCGImage:tmpImageRef]; 
(gdb) 
31   return self; 
(gdb) print (CGSize)[puzzle size] 
$2 = { 
    width = 2048, 
    height = 1536 
} 
(gdb) 

La première impression est sur la ligne de instanciation CGIMageRef. Toute aide reçue avec gratitude. Comme je l'ai dit, cela n'arrive pas dans le simulateur et seulement quand je déploie le code sur un périphérique réel. Veuillez noter que ce message indiquait que le problème ne se produisait que sur les périphériques et non sur le simulateur. J'ai depuis copié une photo prise avec l'appareil photo sur mon iphone 3gs au simulateur et exactement le même problème se produit. Donc, si vous avez une image 2048x1536 qui traîne, vous devriez être en mesure de reproduire cela dans la simulation.

Répondre

2

Les UIImage ont une propriété d'orientation que vous ignorez lorsque vous extrayez l'image CGImage de l'UIImage. Vous devriez faire ceci:

if (self = [super init]) { 
    puzzle = image; 
} 
+0

Cela préserve l'orientation. Je viens de trouver ce post http://stackoverflow.com/questions/1260249/resizing-uiimages-pulled-from-the-camera-alot-rotates-the-uiimage couvrant une chose similaire. Quand je l'ai fait de cette façon avant que le code ne plante, et j'ai supposé que c'était parce que l'image était en train de sortir plus tard. Cela ne semble pas être le cas maintenant, alors j'ai dû faire des bêtises alors que je cherchais une solution que j'avais inventée avec la méthode imageref; ce que je pensais être un peu la merde pour une langue moderne. Je vous remercie! – Diziet

+0

En outre, beaucoup plus tard dans le développement, j'ai fini par traduire et faire pivoter l'image comme il se doit pour supprimer ce problème car il devenait difficile de traiter les données d'orientation dans différentes bibliothèques et systèmes. par exemple. graphiques de base, opencv, manipulation de bits. – Diziet