问题简历:
我用相机拍照或从库中选择一张照片,然后向其添加一些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
图片上传到Twitter:Twitter image on my server
来自文件的照片:Picture from the documents on my server (there is a huge difference!)
那么,有没有人知道我应该为代码中的图像选择哪些设置来提高质量(即使在.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压缩,只要会出现'带文字,大块颜色或简单形状的图像',它就会来得很厉害。太糟糕了。
答案 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)创建文本,并在将其添加到图片上之前将其缩小。图像插值会使图像模糊,从而使您的人员抗锯齿效果不佳。