社交共享图像的图像质量

时间:2013-10-05 09:31:25

标签: ios objective-c image image-quality socialshare

问题简历:

我用相机拍照或从库中选择一张照片,然后向其添加一些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来说,共享图片的质量似乎是相同的,在这种情况下相同也意味着非常糟糕。

我用于推特分享的代码:

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和加利福尼亚州南部,而不是尝试解决这个荒谬的问题。


现在来拍照了!

嗯..所以在我尝试上传图片之后,上传的东西也将.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压缩之后,这在任何地方都可以完成,甚至在这里),至少在某种程度上更好?而在我看来,它只发生在带有文字的纯色背景上(当我尝试上传没有背景的图像时,它看起来更好,但必须有一种方法如何让它看起来更好看背景)

谢谢!

修改 事实证明,问题可能不在于共享内容,而在于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压缩,只要会出现'带文字,大块颜色或简单形状的图像',它就会来得很厉害。太糟糕了。

1 个答案:

答案 0 :(得分:0)

JPEG压缩最适合连续色调图像,如照片。它不适用于纯色区域和文本等尖锐传统。 Png / Gif效果更好。有一些格式可以更好地解决这个问题,例如Facebook认为使用但放弃的Google WebP。

你最好的方法是坚持使用JPEG并使用JPEG编码设置,但是你可以做一些事情。使用内置iOS字体调整字体或使用自己的自定义字体。由于纯色的急剧转换会导致问题,因此请避免使用Serif字体。字体越大越大越好。 IOS支持自定义字体,因此可以使用不同的开源字体,并找到一个可以接受的最大字体。请遵循这篇文章

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

另一个有帮助的是抗锯齿。这是边缘颜色模糊的地方,使文本看起来更具可读性(过度简化)。文本不会出现抗锯齿,你不能轻易强制抗锯齿,但你可以伪造它。在具有透明度的单独图像中以较大尺寸(2至3x)创建文本,并在将其添加到图片上之前将其缩小。图像插值会使图像模糊,从而使您的人员抗锯齿效果不佳。