我正在开发一款iphone应用, 我需要在运行时操作图像,以便我可以给它一个图像边框。
我需要组合两个UIImages,一个作为边框或背景图像,另一个UIImage将驻留在第一个,所以最好的方法是什么?
我读到了一些函数,如UIGraphicsGetCurrentContext(),但它似乎应该在主线程完成,我需要一些较轻的代码,因为我需要多次调用它。谢谢
答案 0 :(得分:7)
图片处理
这是一个例子(未经过测试,只是为了向您展示一个想法):
-(UIImage *)imageWithImage:(UIImage *)image borderImage:(UIImage *)borderImage covertToSize:(CGSize)size {
UIGraphicsBeginImageContext(size);
[borderImage drawInRect:CGRectMake( 0, 0, size.width, size.height )];
[image drawInRect:CGRectMake( 10, 10, size.width - 20, size.height - 20)];
UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return destImage;
}
它绘制背景图像,而不是图像,它会相当小。如果你想真正使用图像操作并且borderImage不透明,你可以使用它。如果它是透明的,您可以在图像上绘制它(使用drawRect:调用交换线)。
仅供展示
或者,如果您只想将其用于显示目的,可以叠加视图,也可以使用Quartz并通过CALayer设置某种边框。
self.imageView.layer.cornerRadius = 3.0;
self.imageView.layer.masksToBounds = YES;
self.imageView.layer.borderColor = [UIColor blackColor].CGColor;
self.imageView.layer.borderWidth = 1.0;
答案 1 :(得分:1)
如果您的边框是透明的,您可以创建一个UIImageView
,其中包含您的图片,另一个UIImageView
包含您的边框,然后将它们作为子视图添加到视图中,边框在图像的顶部。
答案 2 :(得分:1)
为什么不直接将第二个UIImageView作为第一个子视图(Border imageView)?
答案 3 :(得分:1)
这是我在UIView扩展中使用时找到的一段代码。不知道该归功于谁,但现在是:
- (UIImage *)overlayWithImage:(UIImage *)image2 {
UIImage *image1 = self;
CGRect drawRect = CGRectMake(0.0, 0.0, image1.size.width, image1.size.height);
// Create the bitmap context
CGContextRef bitmapContext = NULL;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
CGSize size = CGSizeMake(image1.size.width, image1.size.height);
// Declare the number of bytes per row. Each pixel in the bitmap in this
// example is represented by 4 bytes; 8 bits each of red, green, blue, and
// alpha.
bitmapBytesPerRow = (size.width * 4);
bitmapByteCount = (bitmapBytesPerRow * size.height);
// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL) {
return nil;
}
// Create the bitmap context. We want pre-multiplied ARGB, 8-bits
// per component. Regardless of what the source image format is
// (CMYK, Grayscale, and so on) it will be converted over to the format
// specified here by CGBitmapContextCreate.
bitmapContext = CGBitmapContextCreate (bitmapData, size.width, size.height,8,bitmapBytesPerRow, CGColorSpaceCreateDeviceRGB(),kCGImageAlphaNoneSkipFirst);
if (bitmapContext == NULL)
// error creating context
return nil;
// Draw the image to the bitmap context. Once we draw, the memory
// allocated for the context for rendering will then contain the
// raw image data in the specified color space.
CGContextDrawImage(bitmapContext, drawRect, [image1 CGImage]);
CGContextDrawImage(bitmapContext, drawRect, [image2 CGImage]);
CGImageRef img = CGBitmapContextCreateImage(bitmapContext);
UIImage* ui_img = [UIImage imageWithCGImage: img];
CGImageRelease(img);
CGContextRelease(bitmapContext);
free(bitmapData);
return ui_img;
}