2015-02-16 6 views
0

Я не уверен, где я делаю ошибку, поэтому я хотел бы вставить здесь несколько блоков кодов, чтобы узнать, что пошло не так.Как сохранить UIImage в прозрачный PNG?

У меня есть изображения PNG, которые имеют прозрачный фон и с использованием блока кодов ниже. Я пытаюсь сохранить выбранное изображение в папку приложения и NSUserDefault. И затем я пытаюсь вызвать это сохраненное изображение из папки приложения и отобразить на UIBarButtonItem.

Целью сохранения в NSUserDefault также является тестирование.

Так,

Это, как я выбрать изображение.

- (IBAction)btnPressed:(UIButton *)sender 
{ 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) 
    { 
     UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init]; 
     imgPicker.delegate = self; 
     imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
     imgPicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage]; 
     imgPicker.allowsEditing = NO; 

     [self presentViewController:imgPicker animated:YES completion:nil]; 
    } 

} 

И с этим я спасаю его приложения с помощью didFinishPickingMediaWithInfo;

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 

    if ([mediaType isEqualToString:(NSString *) kUTTypeImage]) 
    { 
     UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

     //I believe this has the problem. 
     NSData *pngData = UIImagePNGRepresentation(image); 

     NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"AppImages"];; 

     NSError *error = nil; 

     if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath]) 
     [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error]; 

     NSString *fileName = [stringPath stringByAppendingPathComponent:@"logoImage.png"]; 
     [pngData writeToFile:fileName atomically:YES]; 
     NSUserDefaults *logoUserDef = [NSUserDefaults standardUserDefaults]; 
     [logoUserDef setValue:pngData forKey:@"logoImageData"]; 
    } 
} 

Примечание: У меня нет проблемы для изображений, которые не имеют прозрачный фон.

И, наконец, так я называю это как из приложения, так и из NSUserDefault.

Использование NSUserDefaults и AppDirectory, чтобы увидеть, показывают ли они разные результаты.

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"logoImageData"]) 
{ 
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; 
    UIImage *testing = [UIImage imageWithData:[user valueForKey:@"logoImageData"]]; 

    NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    UIImage * image = [self loadImageWithFileName:@"logoImage" ofType:@"png" inDirectory:documentsDirectory]; 

    UIBarButtonItem *logoBarButton = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(logoTapped)]; 
    logoBarButton.imageInsets = UIEdgeInsetsMake(9, 0, 9, 90); 
    logoBarButton.image = [logoBarButton.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
    [self.navigationItem setLeftBarButtonItems:@[logoBarButton]]; 
} 

И метод, который возвращает UIImage из документа приложения.

-(UIImage *)loadImageWithFileName:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath { 
    UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@/%@.%@", directoryPath, @"AppImages", fileName, [extension lowercaseString]]]; 

    return result; 
} 

Я не знаю, откуда я поступаю неправильно, но, как всегда, когда я выбираю изображение с прозрачным фоном. Он всегда преобразует свой фон в белый. Мне нужно сохранить его так же прозрачно. Я много искал, но не смог найти ничего, чтобы решить эту проблему.

Любая помощь приветствуется.

+0

Хм ... Похоже, вы специально извлекаете данные при извлечении изображения.Я напишу предложение за секунду. –

+0

На самом деле, «тестовое» изображение не прозрачно? Кажется, что ваш код там правильный ... Вы уверены, что фон кнопки ясен? Я также рекомендую поместить изображение в UIImageView для тестирования, чтобы проверить прозрачность. –

+0

@ LyndseyScott Спасибо за ваш ответ. Мне нужно упомянуть, что я считаю, что проблема возникает, когда я сохраняю изображение после выбора, потому что после сохранения, чтобы убедиться, что у меня есть, я проверяю его в своей папке приложения. Если выбранное изображение было прозрачным, его фон стал белым. Если был выбран непрозрачный, то его рабочий штраф. Поэтому в результате моя проблема в том, что я не получаю то, что я выбираю. –

ответ

1

Решила проблему!

Блок кодов, которые я разместил с моим вопросом, не имеет ничего плохого. Проблема возникла из iTunes, когда я синхронизирую изображения с моего Mac на мой iPhone iTunes, конвертирую их в JPEG и из-за того, что эти изображения теряют прозрачность и т. Д. ... и когда я выбираю изображения с помощью своего приложения, я выбирал их как JPEG без осознавая это, и поэтому у меня были эти проблемы.

Так что я придумал решение для получения изображений по электронной почте. Я просто отправляю их с моего mac на iPhone с помощью электронной почты, и этими изображениями ничего не потеряно, как функция. После этого, когда я использовал их в приложении в качестве правильного изображения, программа работала так, как предполагалось.

+0

Мы также можем протестировать PNG-файлы в Simulator. Мы можем перетаскивать png-изображения из «Finder» прямо в приложение «Photos» в Simulator. Эти изображения возвращаются как правильные png-изображения с прозрачностью, из imagepicker в нашем приложении. – SHS

0

Вы писали

 [logoUserDef setValue:pngData forKey:@"logoImageData"]; 

, но я не вижу, где вы синхронизации. Поэтому добавьте:

 [logoUserDef synchronize]; 
+0

Я добавлю это, чтобы увидеть изменения. Я сообщу вам результат. Спасибо –

+0

Я протестировал. Добавление '[logoUserDef synchronize];' не имеет никакого значения. Код по-прежнему преобразует прозрачный фон в белый. –

Смежные вопросы