2

我正在开发一个 iPhone 应用程序,它可以创建图片并将它们发布到 Facebook 和 Instagram。

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;
}

我做错了什么,我该如何解决?

(虽然我在这里,但我还要说我对使用图形上下文很陌生,所以如果代码中有任何尴尬,我会很感激你指出。)

编辑: 现在我将这两种方法简化为一种,这次我什至没有得到文本。啊!

-(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.sizeand myImage.scalesize将数字乘以scale

如果您的背景图像是 Retina 质量的,那么您的图像实际上是 1224 x 1224。

UIImage 文档

您应该避免创建尺寸大于 1024 x 1024 的 UIImage 对象。除了这样的图像会消耗大量内存之外,在 OpenGL ES 中将图像用作纹理或将图像绘制到视图或图层时,您可能会遇到问题。如果您正在执行基于代码的操作,例如通过将图像绘制到支持位图的图形上下文来调整大于 1024 x 1024 像素的图像大小,则此大小限制不适用。实际上,您可能需要以这种方式调整图像的大小(或将其分成几个较小的图像),以便将其绘制到您的视图之一。

如果您的图像实际上是 612像素(不是points),但您的代码将其渲染为 1224 像素,您只需将scale属性更改为 1.0。

如果您的图像实际上是 1224 像素,则您需要执行其他操作,例如

  • 将您的代码放在位图支持的图形上下文中(即,UIGraphicsBeginImageContext围绕有问题的代码进行调用)
  • 向用户显示较小的版本

但是,如果您的图片用于 Instagram,则不应为 1224 x 1224 :-)

更新: 我注意到您的应用与俳句相关,所以这里是俳句格式的答案:

大 UIImage?

位图支持的图形上下文

或者缩小到612

于 2013-02-05T01:06:15.663 回答
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 回答
0

我总是支持显而易见的问题:

  • 您的图像实际上是否正确命名/拼写为 backgroundForInstagram.png?
  • 您是否已将其正确添加到您的项目中?
  • 添加时,它是否在构建阶段的复制步骤中复制到设备?
  • 在编辑的代码中调用时 ghv 中有什么?
  • 渲染时 ghv.lines 的 item[1] 中有什么?

这些是我在调试这段代码时要考虑的事情。

于 2013-02-06T17:15:54.967 回答