问题描述
我正在设计一个应用程序,其中用户将多个 UIImageView 一个接一个地放置.当用户决定将其保存到相册时,我必须将所有这些 UIImageViews 组合起来并将其保存到照片库中.在组合它们时,我需要保留它们的位置、分辨率、zorder.我尝试过的方法是拥有一个类似于容器的父 UIView.用户将所有 UIImageViews 放在这个 UIView 中.保存时,我截取 UIView 的屏幕截图并保存.尽管这种方法有效,但它不保留分辨率.最终图像的分辨率与父 UIView 大小的分辨率相同(宽度和高度均为 300 像素).有没有办法保留分辨率?或者至少有更高的分辨率,比如高达 1024 x 768 像素?任何指针/代码示例将不胜感激!
I am designing an application where a user places multiple UIImageViews one over another. When the user decides to save this to photo album, I have to combine all these UIImageViews and save it to Photo Library. While combining them I need to preserve their positions, resolutions, zorder. The approach I tried I was to have a parent UIView which acts like a container. The user places all the UIImageViews inside this UIView. While saving, I take a screenshot of the UIView and save it. Although this approach works, it does not preserve the resolution. The resolution of the final image is same as the resolution of the parent UIView size (width and height being 300 pixels). Is there way to preserve the resolution? or atleast have a higher resolution like upto 1024 x 768 pixels? Any pointers/code examples would be appreciated!
推荐答案
如果 UIView 的大小高于您拥有的最大图像的大小,那么您正在做的事情,保存 UIView 是一个非常好的主意,但是几乎从来没有这样.您需要做的是创建一个图形上下文 (CGContextRef),与最大的图像一样大,按 z 顺序对图像进行排序并开始在那里绘制这些图像.我会尝试用一些伪代码来帮助你:
What you are doing, saving the UIView, is a very good idea if the size of the UIView is higher than the size of the biggest image you have, but that's almost never the case.What you have to do is to create a Graphic Context (CGContextRef), as big as the biggest of your images, sort your images by z-order and start drawing those images there.I'll try to help you with some pseudo code:
-(UIImage *)mergeFlag{
UIImage * mergedImage = nil;
//In some pace you need to fill these values with the biggest width of all your images and the biggest height;
int Max_Width;
int Max_Height;
//Use here your image with the biggest Z-order.
CGImageRef image;
size_t cWitdh = Max_Width;
size_t cHeight = Max_Height;
size_t bitsPerComponent = 8;//If 8 isn't right you should use CGImageGetBitsPerComponent(image) with some image.
size_t bytesPerRow = 4 * Max_Width;// I use 4 assuming you have 8 Bits per component and you have 4 components (R,G,B,A) , if you have an image specifically, you can use CGImageGetBytesPerRow(image)
//Now we build a Context with those dimensions.
CGContextRef context = CGBitmapContextCreate(nil, cWitdh, cHeight, bitsPerComponent, bytesPerRow, CGColorSpaceCreateDeviceRGB(), CGImageGetBitmapInfo(image));
//The code of this cycle is to ilustrate what you have to do:
for(image in your Images ordered by z-Order)
{
//The location where you draw your image on the context is not always the same location you have in your UIView,
//this could change and you need to calculate that position according to the scale between you images real size, and the size of the UIImage being show on the UIView.
CGContextDrawImage(context, CGRectMake(currentImage.frame.origin.x, currentImage.frame.origin.y, CGImageGetWidth(currentImage), CGImageGetHeight(currentImage), currentImage);
}
CGImageRef mergeResult = CGBitmapContextCreateImage(context);
mergedImage = [[UIImage alloc] initWithCGImage:tmp];
CGContextRelease(context);
CGImageRelease(mergeResult);
return mergedImage;}
希望对你有帮助.
这篇关于组合多个 UIImageViews 并保留分辨率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!