4

問題の再開:

カメラで写真を撮るか、ライブラリから 1 つを選択し、 UITextField(選択した写真の隣にUIImageView) をいくつか追加して、そのすべての 1 つを作成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 フォントを使用するか、独自のカスタム フォントを使用して、フォントを調整します。ベタの急激な変化は不具合の原因となるため、セリフフォントの使用は避けてください。また、フォントは太く、大きいほど良いです。IOS はカスタム フォントをサポートしているため、さまざまなオープン ソース フォントを試して、許容できる最大サイズのフォントを見つけてください。この記事に従ってください

http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ .

役立つもう 1 つのことは、アンチエイリアシングです。これは、エッジの色がぼやけてテキストが読みやすくなっている場所です (簡略化されています)。テキストはアンチ エイリアス処理されず、アンチ エイリアス処理を簡単に強制することはできませんが、偽装することはできます。透明度のある別の画像に大きなサイズ (2 ~ 3 倍) のテキストを作成し、画像の上に追加する前に縮小します。画像の補間により、画像がぼやけ、貧弱なアンチエイリアシングが得られます。

于 2014-12-05T20:56:28.613 に答える