Качество изображения социального изображения
Проблема Возобновить:
Я делаю фото с камеры или выбрал один из библиотеки, а затем добавить некоторые UITextField
с ним (рядом с UIImageView
с выбранной картинкой), создайте UIImage
обо всем этом, а затем я хочу поделиться этим, особенно в Facebook и Twitter. Я могу это сделать, однако качество изображения значительно падает. Как я могу настроить код так, чтобы качество оставалось на высоте?
Длинное описание с кодом и изображениями
Прежде всего, я выбрал между камерой и библиотекой. Затем, после того, как я выбираю изображение каким-то образом, я получаю его с
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
метод, где я назначаю изображение для моего глобального UIImage *chosenImage
, с которым я использую это потом.
Затем я добавляю chosenImage
к UIImageView
и, как брат, я добавляю UITextField
, как это:
UIImageView *chosenImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, actualHeight - 50)];
[chosenImageView setBackgroundColor:[UIColor clearColor]];
[chosenImageView setContentMode:UIViewContentModeScaleAspectFill];
[chosenImageView setClipsToBounds:YES];
[chosenImageView setImage:chosenImage];
UITextField *textFieldName = [[UITextField alloc] initWithFrame:CGRectMake(15, 15, 290, 30)];
[textFieldName setBackgroundColor:[UIColor blueColor]];
[textFieldName setDelegate:self];
[textFieldName setTag:-1];
[textFieldName setText:textName];
[textFieldName sizeToFit];
[textFieldName setContentScaleFactor:2.0];
[pageView addSubview:textFieldName];
[pageView addSubview:chosenImageView];
После этого у меня есть "поделиться этим!" Кнопка, которая после нажатия предоставляет возможность поделиться изображением в Facebook и Twitter. Я тогда получаю UIImage *imageToShare
с помощью этого метода для преобразования UIView
в UIImage
(который, кажется, работает хорошо, imho):
- (UIImage *)changeViewToImage:(UIView *)view
{
UIGraphicsBeginImageContextWithOptions([view bounds].size, NO, 0);
[[view layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Похоже, что качество общего изображения одинаково для Facebook и Twitter, и то же самое в этом случае означает очень плохо.
код, который я использую для обмена Twitter:
SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@""];
[tweetSheet addImage:imageToShare];
[tweetSheet setCompletionHandler:^(SLComposeViewControllerResult result) {
[self dismissViewControllerAnimated:YES completion:nil];
}];
[self presentViewController:tweetSheet animated:YES completion:nil];
и код, который я использую для публикации в Facebook:
NSDictionary *params = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:UIImagePNGRepresentation(imageToShare), imageDescription, nil] forKeys:[NSArray arrayWithObjects:@"source", @"message", nil]];
[FBRequestConnection startWithGraphPath:@"me/photos" parameters:params HTTPMethod:@"POST" completionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
[[[UIAlertView alloc] initWithTitle:@"Success!" message:@"Your photo was successfully posted to your Facebook Wall" delegate:nil cancelButtonTitle:@"Ok :)" otherButtonTitles:nil, nil] show];
[self returnFromShareView];
}];
Тем не менее, я добавил код для сохранения imageToShare
к документам:
NSData *data = UIImagePNGRepresentation(imageToShare);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"currentImage.png"]; //Add the file name
[data writeToFile:filePath atomically:YES]; //Write the file
и когда я смотрю это там, это выглядит довольно хорошо! Что действительно заставляет меня задуматься, почему я не использую конверт с напечатанным изображением (конечно, тот, который сохранен в документах!) И не отправляю его в Менло-Парк, Калифорния и Юг Маркет, Калифорния, вместо того, чтобы пытаться решить эту нелепую проблему.
А теперь фотки!
хм... Так что после того, как я попытался загрузить изображения здесь, загрузка штуковины также превратила изображение.png в ужасное качество!!! Ага, я думал, что стек Overflow со мной!
В любом случае, на моем сервере есть фотографии (загруженные здесь) и соответствующие ссылки, на которых показаны настоящие изображения (которые, я надеюсь, их тоже не уничтожат)
Изображение загружено в Facebook: изображение Facebook на моем сервере
Изображение загружено в Twitter: изображение Twitter на моем сервере
Картинка из документов: Картинка из документов на моем сервере (разница огромная!)
Итак, кто-нибудь знает, какие настройки я должен выбрать для изображения в коде, чтобы сделать качество (даже после сжатия.jpg, которое выполняется везде, где кажется, даже здесь) хотя бы как-то лучше? И, как мне кажется, это происходит только на сплошном фоне с текстом на нем (когда я пытался загрузить изображение без фона, оно выглядело лучше, но должен быть способ, как сделать его лучше и с фоном).)
Спасибо!
РЕДАКТИРОВАТЬ Как выясняется, проблема может быть не в общем доступе, а в самом сжатии jpeg. Как говорится здесь, в ответе: Facebook: способы сохранить качество изображения загружаемых изображений?,
"JPEG не подходит для изображений с текстом, большими цветными блоками или простыми формами, потому что четкие линии будут размыты, а цвета могут сместиться. http://graphicssoft.about.com/od/graphicformats/f/summary.htm "
Поэтому я думаю, что нет никакого решения, так как Facebook, Twitter и даже stack.imgur используют сжатие jpeg, и до тех пор, пока будет "изображение с текстом, большими блоками цвета или простыми формами", оно будет плохим. Очень плохо.
1 ответ
Сжатие JPEG лучше всего подходит для изображений с непрерывным тоном, таких как фотографии. Он плохо работает с однотонными областями и такими острыми традициями, как текст. Png/Gif работает намного лучше. Есть некоторые форматы, которые лучше справляются с этим, например, Google WebP, который Facebook рассматривал как использование, но отказался.
Лучше всего придерживаться JPEG и играть с настройкой кодирования JPEG, но есть несколько вещей, которые вы можете сделать. Настройте ваш шрифт либо с помощью встроенных шрифтов iOS, либо используйте свой собственный шрифт. Поскольку резкие переходы сплошного цвета вызывают проблемы, избегайте использования шрифтов с засечками. Также чем толще шрифт и чем он больше, тем лучше. IOS поддерживает пользовательские шрифты, поэтому поэкспериментируйте с различными шрифтами с открытым исходным кодом и найдите тот, который вам подходит больше всего. Следуйте этой статье
http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/.
Еще одна вещь, которая помогает, это антиалиасинг. Это то место, где цвета краев размыты, что делает текст более читабельным (упрощение). Текст не будет сглаженным, и вы не сможете легко принудительно сглаживать, но вы можете подделать его. Создайте текст большего размера (от 2 до 3х) на отдельном изображении с прозрачностью и уменьшите его, прежде чем добавить к изображению. Интерполяция изображений приведет к размытию изображений, что даст вам плохой антиалиасинг.