Я не уверен, где я делаю ошибку, поэтому я хотел бы вставить здесь несколько блоков кодов, чтобы узнать, что пошло не так.Как сохранить 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;
}
Я не знаю, откуда я поступаю неправильно, но, как всегда, когда я выбираю изображение с прозрачным фоном. Он всегда преобразует свой фон в белый. Мне нужно сохранить его так же прозрачно. Я много искал, но не смог найти ничего, чтобы решить эту проблему.
Любая помощь приветствуется.
Хм ... Похоже, вы специально извлекаете данные при извлечении изображения.Я напишу предложение за секунду. –
На самом деле, «тестовое» изображение не прозрачно? Кажется, что ваш код там правильный ... Вы уверены, что фон кнопки ясен? Я также рекомендую поместить изображение в UIImageView для тестирования, чтобы проверить прозрачность. –
@ LyndseyScott Спасибо за ваш ответ. Мне нужно упомянуть, что я считаю, что проблема возникает, когда я сохраняю изображение после выбора, потому что после сохранения, чтобы убедиться, что у меня есть, я проверяю его в своей папке приложения. Если выбранное изображение было прозрачным, его фон стал белым. Если был выбран непрозрачный, то его рабочий штраф. Поэтому в результате моя проблема в том, что я не получаю то, что я выбираю. –