社交分享图片的图像质量

3

问题简述:

我使用相机拍摄照片或从图库中选择一张照片,然后在其上添加一些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(在我看来似乎运行良好)。
- (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图像变成了可怕的质量!啊,我还以为StackOverflow会帮助我的!
无论如何,这些是图片(在此处上传),以及相应的链接,显示在我的服务器上的实际图像(我希望它们也不会被破坏)
上传到Facebook的图片:我的服务器上的Facebook图片 Facebook图片 上传到Twitter的图片:我的服务器上的Twitter图片 Twitter图片


文档中的图片:我的服务器上的文档图片(有很大的区别!) 文档图片

那么,有人知道在代码中选择什么设置可以使图像质量(即使在 .jpg 压缩后,似乎到处都是压缩)至少有所提高吗?而且在我看来,这只发生在带有文字的纯色背景上(当我尝试上传没有背景的图像时,它看起来更好,但一定有方法可以使它在有背景的情况下看起来更好)

谢谢!

编辑 事实证明,问题可能不在共享方面,而在于 jpeg 压缩本身。正如答案中所述:Facebook:保留上传图像的图像质量的方法?

"JPEG不适合带有文本、大块颜色或简单形状的图像,因为清晰的线条会变得模糊,颜色也会发生偏移。http://graphicssoft.about.com/od/graphicformats/f/summary.htm所以我想没有解决方案,因为Facebook、Twitter甚至stack.imgur都使用JPEG压缩,只要还有'带有文本、大块颜色或简单形状的图像',它就会出现问题。太糟糕了。"

你尝试过使用 UIImageJPEGRepresentation (UIImage *image, CGFloat compressionQuality); 吗?这可以通过改变压缩率来改变图像的质量。 - Ömer Faruk Almalı
我确实尝试过那个方法,但没有成功。而且,人们可能会猜想使用PNG格式应该能够创建高质量的图像,几乎与JPEG格式并将压缩质量设置为百分之百相同,然而这也失败了。 - Gyfis
类似问题:http://stackoverflow.com/q/10966089/448734 - Bryan
1个回答

0
JPEG压缩最适合处理如照片等连续色调图像,但对于纯色块和锐利转折(如文本)效果不佳。PNG/Gif则更好。还有一些格式可以更好地处理此类问题,例如Google WebP,Facebook曾考虑使用但已放弃。
你最好仍然采用JPEG并尝试不同的编码设置,但也有一些事情可以做。使用内置iOS字体或自定义字体来调整字体。由于纯色块的锐利转折会导致问题,应避免使用衬线字体。同时,字体越粗、越大,效果越好。iOS支持自定义字体,可以测试不同的开源字体并找到最大可接受的大小,详见本文http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/

另一个有帮助的事情是抗锯齿。这是指边缘颜色被模糊,使得文字看起来更容易阅读(过于简化)。文字不会进行抗锯齿处理,你也不能轻易地强制进行抗锯齿处理,但你可以伪造它。在一个透明度为大一些(2到3倍)的图像中创建文字,然后在将其缩小并添加到图片上之前进行缩放。图像插值将模糊图像,从而实现了一个“穷人版”的抗锯齿效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接