2013-10-05 4 views
4

Проблема Резюме:Изображения социально общим образом

Я беру фотографию с камерой или выбрать один из библиотеки, а затем добавить некоторые UITextField S к нему (рядом 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 (который, кажется, работает нормально, имхо):

- (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 

и когда я смотрю там, это выглядит довольно хорошо! Что действительно заставляет меня задаться вопросом, почему я не использую конверт с напечатанной картинкой (тот, который сохранен в документах, конечно!), И не отправляйте его в Menlo Park, CA и South of Market, CA, а не пытаетесь решить эту нелепую проблему.


Теперь пришли фотографии!

umh .. Так что после того, как я попытался загрузить изображения здесь, загружающая вещь превратила изображение .png в ужасное качество! Aagh, я думал, что stackOverflow со мной!

В любом случае, вот фотографии (загруженные здесь), а также соответствующие ссылки, которые показаны реальные изображения, на моем сервере (я надеюсь, что не уничтожит их, а)


Изображение загружено на Facebook: Facebook image on my server Facebook picture


Изображение загружено в Twitter: Twitter image on my server Twitter picture


Картина из документов: Picture from the documents on my server (there is a huge difference!) Documents image

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

Спасибо!

EDIT Как выясняется, проблема может быть не в том, что касается обмена, а с само сжатием jpeg. Как говорится здесь, в ответе: Facebook: Ways to preserve image quality of uploaded images?,

«JPEG не подходит для изображений с текстом, крупными блоками цвета, или простыми формами, потому что четкие линии размоют и цвет может смещаться http://graphicssoft.about.com/od/graphicformats/f/summary.htm

Так что, я думаю, что нет решения, так как Facebook, Twitter и даже stack.imgur используют сжатие jpeg, и пока будет «изображение с текстом, большие блоки цвета или простые фигуры», это будет плохо. Очень жаль.

+0

Вы пытались использовать 'UIImageJPEGRepresentation (UIImage * image, CGFloat compressionQuality);'? Это позволяет вам изменять качество изображения, изменяя коэффициент сжатия. –

+0

Я действительно пытался это сделать, и это было бесполезно.Кроме того, можно было бы предположить, что использование представления PNG должно создать изображение с высоким качеством, в значительной степени такое же, как JPEG-представление с параметром compressionQuality, равным стопроцентному, но оно также не удалось. – Gyfis

+0

Аналогичный вопрос: http://stackoverflow.com/q/10966089/448734 – Bryan

ответ

0

JPEG-сжатие лучше всего подходит для непрерывных тоновых изображений, таких как фотографии. Он не работает хорошо с областями сплошного цвета и острыми традициями, такими как текст. Png/Gif работает намного лучше. Есть некоторые форматы, которые касаются этого лучше, такие как Google WebP, который Facebook считал использующим, но оставленным.

Лучше всего придерживаться JPEG и играть с настройкой кодирования JPEG, но есть несколько вещей, которые вы можете сделать. Отрегулируйте шрифт либо со встроенными шрифтами iOS, либо используйте свой собственный шрифт. Поскольку резкий переход сплошного цвета вызывает проблему, не используйте шрифты Serif. Кроме того, толще шрифт и больше, тем лучше. IOS поддерживает пользовательские шрифты, поэтому вы можете использовать различные шрифты с открытым исходным кодом и найти один из самых больших размеров, который вы можете принять. Следуйте этой статье

http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/.

Другая вещь, которая помогает сглаживать. Здесь цвета краев размыты, что делает текст более читаемым (более упрощенное). Текст не будет сглажен, и вы не сможете легко сгладить сглаживание, но вы можете подделать его. Создайте текст в большем размере (от 2 до 3x) на отдельном изображении с прозрачностью и уменьшите его, прежде чем добавлять его поверх изображения. Интерполяция изображений приведет к размытию изображений, которые дают вам плохое анти-сглаживание.

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