iPhone / Xcode: UIImage и UIImageView не получатся с программой - PullRequest
2 голосов
/ 09 февраля 2011

Я пытаюсь сохранить и загрузить UIImage в каталог документов iPhone и из него после того, как изображение выбрано из библиотеки фотографий iPhone. Это можно сделать, но по какой-то причине, когда я загружаю изображение, оно поворачивает его на 90 градусов против часовой стрелки. Вот мои методы saveImage и loadImage:

Сохранить изображение:

- (void)saveImage: (UIImage*)image{
if (image != nil)
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString* path = [documentsDirectory stringByAppendingPathComponent: 
                      [NSString stringWithString: @"lePhoto.png"] ];
    //NSData* data = UIImagePNGRepresentation(image);
    //[data writeToFile:path atomically:YES];
    [UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
    }
}

Загрузить изображение:

- (NSData*)loadImage{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                         NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent: 
                  [NSString stringWithString: @"lePhoto.png"] ];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];


//UIImage *image = [[UIImage alloc] initWithData:data];   //my second try
//UIImage* image = [UIImage imageWithContentsOfFile:path];   //first try
//return image;
return data;
[data release];
}

И сейчас я загружаю изображение вот так, чтобы посмотреть, решит ли оно по какой-то безумной причине мою проблему (очевидно, это не так):

UIImage* theImage = [[UIImage alloc] initWithData:[self loadImage]];

Я провел некоторое тестирование, когда у меня есть два UIImageViews рядом, один слева, который не сохраняет и не загружает изображение перед отображением (он просто показывает вверх изображение, как только фотография выбрана из ImagePicker) и тот, который справа, который отображает ПОСЛЕ сохранения сохранения. Единственный справа - единственный, вращающийся на 90 градусов против часовой стрелки; изображение без сохранения / загрузки отображается правильно. Это происходит только на реальном iPhone. Симулятор показывает оба изображения правильно. Я потратил много-много часов, пытаясь понять это, но безрезультатно. Любые идеи относительно того, что может быть причиной этого?

РЕДАКТИРОВАТЬ: Следует также знать, что изображение всегда говорит, что оно ориентировано вверх, даже если это явно не так! Он вращается только после запуска ВСЕГО кода. Я попытался сделать принудительную перерисовку между моим кодом, чтобы увидеть, если это что-то меняет, но это не так (хотя возможно, что я даже делаю это неправильно. Кто знает, больше). Кроме того, он не будет автоматически делать фотографии, снятые с iPhone. Только фотографии, которые были сделаны камерой. [Я не пробовал загруженные фотографии.] Это самая странная вещь ...

И если вам интересно, как именно я перетаскиваю свою фотографию, вот метод, который, по крайней мере, проливает свет на то, что я делаю (очевидно, не каждый метод необходим для выполнения этой функции, но он дает понимание о том, как я написал свой код):

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
theimageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
[self saveImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"]]; 
[picker dismissModalViewControllerAnimated:YES]; 
}

Любой совет очень ценится. И я знаю это очень много: если есть способ сделать что-то сумасшедшее, чтобы получить какую-то глупую, никогда ранее не слышанную проблему, скорее всего, я найду это, очевидно: P

Ответы [ 3 ]

5 голосов
/ 15 февраля 2011

Хорошо.Я понял.Очевидно, что когда вы сохраняете вещи в формате PNG, а не в формате JPEG, информация об ориентации изображения не сохраняется вместе с ним.Из-за этого каждое загруженное изображение по умолчанию будет показывать ориентацию вверх.Итак, самый простой способ сделать это:

NSData* data = UIImageJPEGRepresentation(image,0.0);
[data writeToFile:path atomically:YES];

вместо этого:

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];

И, конечно, изменить все имена изображений с .png на .jpg.Часть 0.0 кода выше предназначена для управления альфа-уровнями, что требуется для jpegs.Надеюсь, это поможет людям в будущем!

0 голосов
/ 28 сентября 2012

Большое спасибо ... Этот код сработал и сэкономил мне несколько часов работы.

NSData* data = UIImageJPEGRepresentation(image,0.0);
[data writeToFile:path atomically:YES];

вместо

[UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
0 голосов
/ 09 февраля 2011

Я предполагаю, что вы используете библиотеку ресурсов для получения изображения.Если это так, вы хотите получить ориентацию изображения в блоке результатов и манипулировать UIImage для настройки.У меня есть что-то вроде следующего:

ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset)
{
  ALAssetRepresentation* rep = [asset defaultRepresentation];
  _orientation = rep.orientation;

...

}

В сторону: Какое замечательное имя типа, а?Боже мой, нужны ли Objective-C пространства имен!

...