我正在寻找一种堆叠两个UIImages
的方法。我不想简单地合并它们(在另一个上面添加一个),我宁愿想要堆叠它们的像素值
我的知识以UIImageJPEGRepresentation()
获取数据结束,但这不是重点。我需要两个图像的原始图像数据,并创建带有堆叠数据的第三个图像
我非常感谢这里的任何帮助。 :/
编辑:
我和我的一位同事谈过,他指出,这就像是Photoshop中的屏幕层属性。也许这澄清了我的意思。
答案 0 :(得分:0)
如果我正确地理解了你的要求,你可以通过在UIView中按照你想要的方式排列图像,然后拍摄UIView的“截图”并将其保存到UIImage。
将两个UIImages放在带有UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];
的UIImageViews中。确保为要合并的所有图像执行此操作。
创建一个UIView,其大小与您希望最终图像的大小相同:UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, myWidth, myHeight)];
将两个UIImageViews的帧设置为最终图像中所需的帧。你也可以
在这里设置不透明度。 myImageView.frame = CGRectMake(x, y, width, height);
,myImageView.alpha = .5';
将两个UIImageViews添加到您创建的UIView中。 [myView addSubview:myImageView];
现在你需要截取UIView的截图。我不知道它是否真的需要在屏幕上显示才能工作。你可以尝试两种方式。如果它确实需要可见,它可能无关紧要,因为它将在屏幕上显示您可以测量的更短时间。截取屏幕截图并使用以下代码将其存储到UIImage(出于某种原因,我无法正确格式化):
UIGraphicsBeginImageContext(self.myView.bounds.size);
[self.myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
如果您不想要任何警告,还需要将行#import <QuartzCore/QuartzCore.h>
添加到班级的顶部。
在那里,您的组合UIImages存储在finalImage
中。希望这会有所帮助,告诉我这是不是你要求的。
答案 1 :(得分:0)
您可以使用以下内容获取每个图像的位图:
pixels = CGBitmapContextGetData( ctx );
获得像素后,您可以以任何方式添加它们。你可以做一个普通的,平均的,或者......
如果你的像素图是RGBA,那么位置n的像素将是
p = ((UInt32 *) pixels)[n];
迭代所有像素:
pixelCount = CGBitmapContextGetBytesPerRow(ctx)/4 * CGBitmapContextGetHeight(ctx);
for (i = 0; i < pixelCount; i++) {
p = ((UInt32 *) pixels)[n];
newpixel = processpixel(p);
copyofpixels[n] = newpixel;
}
(请注意,您无法更改像素数据,我相信它是不可变的。您必须写入副本或新数组,然后使用CGBitmapContextCreateImage(ctx);
)<从该位图创建UIImage < / p>
这是您访问像素数据的方法:
redByte = p & 0x000000ff;
greenByte = p & 0x0000ff00 >> 8;
blueByte = p & 0x00ff0000 >> 16;
alphaByte = p & 0xff000000 >> 24;
添加时,请确保分别添加红色,绿色,蓝色和alpha。如果添加的值超过255,则将其上限设置为255.根据您的使用情况,忽略alphas。例如:
reds = redByte1 + redByte2;
if (reds > 255) reds = 255;
greens = greenByte1 + greenByte2;
if (greens > 255) greens = 255;
blues = blueByte1 + blueByte2;
if (blues > 255) blues = 255;
// as you can see, everything is getting brighter. A red dot and another darker red dot will result in a brighter red dot, and not a color in-between.
并将其设置回像素:
UInt32 *newPixel = reds + (greens << 8) + (blues << 16); // put in an alpha here if you want
copyofpixels[n] = newPixel;
希望这有帮助。
答案 2 :(得分:0)
我最终使用的方法与假冒长时间曝光相同。