将两个UIImages堆叠为一个



我正在寻找一种堆叠两个UIImages的方法。我不想简单地合并它们(一个加一个(,我更想堆叠它们的像素值
我的知识以UIImageJPEGRepresentation()获取数据结束,但这不是重点。我需要两个图像的原始图像数据,并用堆叠的数据创建第三个图像
我真的很感谢你的帮助

编辑:
我和我的一位同事谈过,他指出,这有点像photoshop中的屏幕层属性。也许这澄清了我的意思。

如果我能正确理解你的要求,你可以通过在UIView中按你想要的方式排列图像,然后拍一张"截屏";并将其保存到UIImage。

  1. 使用UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];将两个UIImages放在UIImageViews中。请确保对所有要组合的图像都执行此操作。

  2. 制作一个UIView,其大小为您希望最终图像的大小:UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, myWidth, myHeight)];

  3. 将两个UIImageView的帧设置为最终图像中所需的位置。你也可以在此处设置不透明度。myImageView.frame = CGRectMake(x, y, width, height);myImageView.alpha = .5';

  4. 将两个UIImageViews添加到您创建的UIView中。[myView addSubview:myImageView];

  5. 现在您需要对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

最新更新