我正在寻找一种堆叠两个UIImages
的方法。我不想简单地合并它们(一个加一个(,我更想堆叠它们的像素值
我的知识以UIImageJPEGRepresentation()
获取数据结束,但这不是重点。我需要两个图像的原始图像数据,并用堆叠的数据创建第三个图像
我真的很感谢你的帮助
编辑:
我和我的一位同事谈过,他指出,这有点像photoshop中的屏幕层属性。也许这澄清了我的意思。
如果我能正确理解你的要求,你可以通过在UIView中按你想要的方式排列图像,然后拍一张"截屏";并将其保存到UIImage。
-
使用
UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];
将两个UIImages放在UIImageViews中。请确保对所有要组合的图像都执行此操作。 -
制作一个UIView,其大小为您希望最终图像的大小:
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, myWidth, myHeight)];
-
将两个UIImageView的帧设置为最终图像中所需的位置。你也可以在此处设置不透明度。
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
中。希望这能有所帮助,如果这不是你想要的,请告诉我。
您可以使用以下方法获取每个图像的位图:
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(
这就是你可以访问像素数据的方式:
redByte = p & 0x000000ff;
greenByte = p & 0x0000ff00 >> 8;
blueByte = p & 0x00ff0000 >> 16;
alphaByte = p & 0xff000000 >> 24;
添加时,请确保分别添加红色、绿色、蓝色和字母。如果相加的值大于255,则将其上限设置为255。根据您的使用情况,忽略字母。例如:
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;
希望这能有所帮助。
我最终使用了与伪造长时间曝光相同的方法。
假长曝光@stackoverflow