2013-10-05 172 views
4

問題簡歷:圖像質量

我採取與相機的照片或選擇一個從庫,然後(旁UIImageView與所選擇的圖像)添加一些UITextField s到它,創建一個全部都是UIImage,然後我想分享一下,特別是在Facebook和Twitter上。我能夠做到這一點,但圖像的質量顯着下降。我如何調整代碼以使質量保持在最佳狀態?


長描述與代碼和圖片

首先,我選擇了相機和圖書館之間。於是,我以某種方式中選擇一個圖片後,我與

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

方法,在這裏我將圖像分配給我的全球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 

和當我在那裏看時,它看起來相當好!這真的讓我想知道爲什麼我不使用帶有打印圖片的信封(當然是保存在文檔中的信封!),並且不要將它發送到CA的Menlo Park和CA的Market of South,而不是嘗試解決這個荒謬的問題。


現在來照片!

umh ..所以,當我試圖上傳圖片在這裏,上傳thingy把.png圖像也變成了可怕的質量!啊,我以爲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壓縮,只要會出現'帶有文本,大塊顏色或簡單形狀的圖像',它就會來得不好。太糟糕了。

+0

您是否嘗試過使用'UIImageJPEGRepresentation(UIImage *圖像,CGFloat compressionQuality);'?這使您可以通過更改壓縮率來更改圖像的質量。 –

+0

我的確確實實在在地嘗試過,而且這並不好。此外,人們會猜測使用PNG表示應該創建一個足夠高質量的圖像,與壓縮質量等於百分之百的JPEG表示幾乎相同,但它也失敗了。 – Gyfis

+0

類似的問題:http://stackoverflow.com/q/10966089/448734 – Bryan

回答

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)創建文本,並在將其添加到圖片之前將其縮小。圖像插值會模糊圖像,給您一個可憐的人抗鋸齒。