我正在开发一款可以制作图片并将其发布到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。没运气。 :(
进一步编辑:好的,我在上面的addTextToImage:
期间记录图像的大小和比例,这是我得到的较小图像,正在工作的图像/ p>
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
答案 0 :(得分:1)
逐步完成代码。创建myImage
后,进入控制台并查看myImage.size
和myImage.scale
。将size
数字乘以scale
。
如果您的背景图片是Retina品质,则您的图片实际为1224 x 1224。
您应该避免创建大于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)
我总是回答明显的问题:
这些是我在调试此代码时会看到的内容。