問題簡歷:圖像質量
我採取與相機的照片或選擇一個從庫,然後(旁UIImageView
與所選擇的圖像)添加一些UITextField
s到它,創建一個全部都是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
和當我在那裏看時,它看起來相當好!這真的讓我想知道爲什麼我不使用帶有打印圖片的信封(當然是保存在文檔中的信封!),並且不要將它發送到CA的Menlo Park和CA的Market of South,而不是嘗試解決這個荒謬的問題。
現在來照片!
umh ..所以,當我試圖上傳圖片在這裏,上傳thingy把.png圖像也變成了可怕的質量!啊,我以爲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壓縮,只要會出現'帶有文本,大塊顏色或簡單形狀的圖像',它就會來得不好。太糟糕了。
您是否嘗試過使用'UIImageJPEGRepresentation(UIImage *圖像,CGFloat compressionQuality);'?這使您可以通過更改壓縮率來更改圖像的質量。 –
我的確確實實在在地嘗試過,而且這並不好。此外,人們會猜測使用PNG表示應該創建一個足夠高質量的圖像,與壓縮質量等於百分之百的JPEG表示幾乎相同,但它也失敗了。 – Gyfis
類似的問題:http://stackoverflow.com/q/10966089/448734 – Bryan