如何创建比设备屏幕更大的UIImage?

时间:2013-01-29 17:09:07

标签: ios graphics uiimage instagram

我正在开发一款可以制作图片并将其发布到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;
}

但是当我使用相同的代码创建一个Instagram图像时,需要612x612,我只得到文本,没有背景图片:

-(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。没运气。 :(

enter image description here

build phases

enter image description here

进一步编辑:好的,我在上面的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

3 个答案:

答案 0 :(得分:1)

逐步完成代码。创建myImage后,进入控制台并查看myImage.sizemyImage.scale。将size数字乘以scale

如果您的背景图片是Retina品质,则您的图片实际为1224 x 1224。

来自the UIImage docs

  

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

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

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

  • 将您的代码放在支持位图的图形上下文中(即围绕违规代码调用UIGraphicsBeginImageContext
  • 向用户显示较小的版本

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

更新:我注意到您的应用与ha句有关,所以这是ha句形式的答案:

  

Big UIImage?

     

支持位图的图形上下文

     

或收缩至612

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我总是回答明显的问题:

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

这些是我在调试此代码时会看到的内容。