2

写真を作成してFacebookやInstagramに投稿できるiPhoneアプリを開発しています。

Facebookの写真の正しいサイズは350x350のようです。実際、このコードは350x350の画像を希望どおりに作成します。

-(UIImage *)createImage {
    UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(0, screenHeight/2-349, 349, 349)];
    v.image = [UIImage imageNamed:@"backgroundForFacebook.png"];  //"backgroundForFacebook.png" is 349x349.

    //This code adds some text to the image.

    CGSize dimensions = CGSizeMake(screenWidth, screenHeight);
    CGSize imageSize = [self.ghhaiku.text sizeWithFont:[UIFont fontWithName:@"Georgia"
                                                                       size:mediumFontSize]
                                     constrainedToSize:dimensions lineBreakMode:0];
    int textHeight = imageSize.height+16;
    UITextView *tv = [self createTextViewForDisplay:self.ghhaiku.text];
    tv.frame = CGRectMake((screenWidth/2)-(self.textWidth/2),s creenHeight/3.5,
                          self.textWidth/2 + screenWidth/2, textHeight*2);
    [v addSubview:tv];

    //End of text-adding code

    CGRect newRect = CGRectMake(0, screenHeight/2-349, 349, 349);
    UIGraphicsBeginImageContext(newRect.size);
    [[v layer] renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [v removeFromSuperview];
    return myImage;
}

しかし、同じコードを使用して612x612である必要があるInstagram画像を作成すると、テキストのみが取得され、背景画像は取得されません。

-(UIImage *)createImageForInstagram {
    UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 612, 612)];
    v.image = [UIImage imageNamed:@"backgroundForInstagram.png"];  //"backgroundForInstagram.png" is 612x612.

    //...text-adding code...

    CGRect newRect = CGRectMake(0, 0, 612, 612);
    UIGraphicsBeginImageContext(newRect.size);
    [[v layer] renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [v removeFromSuperview];
    return myImage;
}

何が間違っているのですか、どうすれば修正できますか?

(私がそれに取り組んでいる間、私はグラフィックコンテキストの使用に非常に慣れていないことも言うので、コードに厄介な点がある場合は、それを指摘していただければ幸いです。)

編集: 2つのメソッドを1つに減らしましたが、今回はテキストも取得しません。ああ!

-(UIImage *)addTextToImage:(UIImage *)myImage withFontSize:(int)sz {
    NSString *string=self.displayHaikuTextView.text;
    NSString *myWatermarkText = [string stringByAppendingString:@"\n\n\t--haiku.com"];
    NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Georgia" 
                                                                                     size:sz],
                                                                     NSFontAttributeName, 
                                                                     nil];
    NSAttributedString *attString = [[NSAttributedString alloc] initWithString:myWatermarkText attributes:attrs];
    UIGraphicsBeginImageContextWithOptions(myImage.size,NO,1.0);
    [myImage drawAtPoint: CGPointZero];
    NSString *longestLine = ghv.listOfLines[1];
    CGSize sizeOfLongestLine = [longestLine sizeWithFont:[UIFont fontWithName:@"Georgia" size:sz]];
    CGSize siz = CGSizeMake(sizeOfLongestLine.width, sizeOfLongestLine.height*5);
    [attString drawAtPoint: CGPointMake(myImage.size.width/2 - siz.width/2, myImage.size.height/2-siz.height/2)];
    myImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return myImage;
}

引数[UIImage imageNamed:"backgroundForFacebook.png"](画像349x349)とを渡すと12、すべて問題ありません。写真が撮れます。引数[UIImage imageNamed:"backgroundForInstagram.png"](画像612x612)を渡すと24、何もしません。

今は小さい画像(@ "backgroundForFacebook.png")にテキストを配置してサイズを変更しているだけですが、テキストがぼやけてしまい、気に入らないのです。

編集:基本をカバーするために、ここに1)このメソッドを呼び出すメソッド(スペルをチェックするため)および2)サポートファイルとビルドフェーズ(イメージが実際にそこにあることを示すため)のイメージがあります。longestLineまた、非変数のNSStringを割り当ててみました。運がない。:(

ここに画像の説明を入力してください

ビルドフェーズ

ここに画像の説明を入力してください

さらに編集:さて、上記の間に行った画像のサイズとスケールを記録しますaddTextToImage:。これが、機能している小さい画像で得られるものです。

2013-02-04 22:24:09.588 GayHaikuTabbed[38144:c07] 349.000000, 349.000000, 1.000000

そして、これが私がより大きな画像で得たものです-それはやっかいです。

Feb  4 22:20:36 Joels-MacBook-Air.local GayHaikuTabbed[38007] <Error>: CGContextGetFontRenderingStyle: invalid context 0x0
Feb  4 22:20:36 Joels-MacBook-Air.local GayHaikuTabbed[38007] <Error>: CGContextSetFillColorWithColor: invalid context 0x0

//About thirty more of these.

Feb  4 22:20:36 Joels-MacBook-Air.local GayHaikuTabbed[38007] <Error>: CGBitmapContextCreate: unsupported parameter combination: 0 integer bits/component; 0 bits/pixel; 0-component color space; kCGImageAlphaNoneSkipLast; 2448 bytes/row.
Feb  4 22:20:36 Joels-MacBook-Air.local GayHaikuTabbed[38007] <Error>: CGContextDrawImage: invalid context 0x0
Feb  4 22:20:36 Joels-MacBook-Air.local GayHaikuTabbed[38007] <Error>: CGBitmapContextCreateImage: invalid context 0x0
4

3 に答える 3

1

コードをステップスルーします。を作成したらmyImage、コンソールに移動してとを確認しmyImage.sizeますmyImage.scalesize数値に。を掛けscaleます。

背景画像がRetina品質の場合、画像は実際には1224x1224です。

UIImageドキュメントから:

サイズが1024x1024を超えるUIImageオブジェクトの作成は避けてください。このような画像が大量のメモリを消費することに加えて、OpenGL ESで画像をテクスチャとして使用する場合、または画像をビューやレイヤーに描画する場合に問題が発生する可能性があります。このサイズ制限は、ビットマップベースのグラフィックスコンテキストに描画して1024x1024ピクセルを超える画像のサイズを変更するなどのコードベースの操作を実行している場合には適用されません。実際、ビューの1つに描画するには、この方法で画像のサイズを変更する(または複数の小さな画像に分割する)必要がある場合があります。

画像が実際には612ピクセルポイントではない)であるが、コードが1224ピクセルとしてレンダリングしている場合は、scaleプロパティを1.0に変更するだけです。

画像が実際に1224ピクセルの場合は、次のような別の操作を行う必要があります。

  • コードをビットマップに裏打ちされたグラフィックスコンテキストに配置します(つまり、UIGraphicsBeginImageContext問題のあるコードを呼び出します)
  • 小さいバージョンをユーザーに表示する

ただし、画像がInstagram用である場合は、1224x1224であってはなりません:-)

更新: あなたのアプリが俳句に関連していることに気づいたので、ここに俳句形式の答えがあります:

大きなUIImage?

ビットマップに裏打ちされたグラフィックスコンテキスト

または612に縮小します

于 2013-02-05T01:06:15.663 に答える
0

私は常に明白な質問にバックアップします:

  • あなたの画像は実際に正しく呼び出され/スペルされたbackgroundForInstagram.pngですか?
  • プロジェクトに適切に追加しましたか?
  • 追加されたとき、ビルドフェーズのコピーステップでデバイスにコピーされましたか?
  • 編集されたコードの呼び出し時にghvには何が含まれていますか?
  • そのレンダリングの時点でghv.linesのitem[1]には何が含まれていますか?

これらは、このコードのデバッグに関して私が見るものです。

于 2013-02-06T17:15:54.967 に答える
0

これを試して

-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
//UIGraphicsBeginImageContext(newSize);
UIGraphicsBeginImageContextWithOptions(newSize, NO, 10.0);//  10.0 means 10 time bigger
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
于 2013-02-06T08:17:03.877 に答える