4

问题简历:

我用相机拍照或从图书馆中选择一张,然后添加一些UITextFields(在所选图片旁边UIImageView),创建其中一张UIImage,然后我想分享这个,特别是在 Facebook 和 Twitter 上。我能够做到这一点,但是图像质量显着下降。如何调整代码以使质量保持领先?


带有代码和图像的详细描述

首先,我在相机和图书馆之间进行了选择。然后,在我以某种方式选择图像之后,我得到它

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

方法,我将图像分配给我的 global UIImage *chosenImage,然后我使用它。

然后,我添加chosenImageUIImageView,作为兄弟,我添加一个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用这种方法将其转换UIViewUIImage(这似乎工作正常,恕我直言):

- (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 图像 脸书图片


图片上传到 Twitter:我服务器上的 Twitter 图片 推特图片


图片来自文档:图片来自我服务器上的文档(有很大的不同!) 文件图片

所以,有谁知道我应该为代码中的图像选择什么设置以提高质量(即使在 .jpg 压缩之后,也已完成似乎无处不在,甚至在这里)至少在某种程度上更好?在我看来,它只发生在带有文字的纯色背景上(当我尝试上传没有背景的图像时,它看起来更好,但必须有一种方法可以使它在背景下看起来更好)

谢谢!

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

“JPEG 不适合带有文本、大块色块或简单形状的图像,因为清晰的线条会模糊并且颜色会发生变化。http: //graphicssoft.about.com/od/graphicformats/f/summary.htm

所以我想没有解决办法,因为 Facebook、Twitter 甚至 stack.imgur 都使用 jpeg 压缩,只要有“带有文本、大块颜色或简单形状的图像”,就会很糟糕。太糟糕了。

4

1 回答 1

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 到 3 倍)的文本,并在将其添加到图片上之前将其缩小。图像插值会使图像变得模糊,从而使您的抗锯齿效果不佳。

于 2014-12-05T20:56:28.613 回答