Objective c 将两个UIImage堆叠为一个

Objective c 将两个UIImage堆叠为一个,objective-c,ios,uiimage,core-graphics,Objective C,Ios,Uiimage,Core Graphics,我正在寻找一种方法来堆叠两个UIImages。我不想简单地合并它们(一个接一个地添加),我更想堆叠它们的像素值。 我的知识最终是通过uiimagejpegresentation()获取数据,但这不是重点。我需要两个图像的原始图像数据,并使用堆叠数据创建第三个图像。 我真的非常感谢您的帮助。:/ 编辑: 我和我的一位同事谈过,他说,这类似于photoshop中的屏幕层属性。也许这就澄清了我的意思。如果我正确理解了你的要求,你可以通过在UIView中按你所希望的方式排列图像,然后拍摄UIView的“

我正在寻找一种方法来堆叠两个
UIImages
。我不想简单地合并它们(一个接一个地添加),我更想堆叠它们的像素值。
我的知识最终是通过
uiimagejpegresentation()
获取数据,但这不是重点。我需要两个图像的原始图像数据,并使用堆叠数据创建第三个图像。
我真的非常感谢您的帮助。:/

编辑:

我和我的一位同事谈过,他说,这类似于photoshop中的屏幕层属性。也许这就澄清了我的意思。

如果我正确理解了你的要求,你可以通过在UIView中按你所希望的方式排列图像,然后拍摄UIView的“屏幕截图”并将其保存到UIImage中

  • 使用
    UIImageView*myImageView=[[UIImageView alloc]initWithImage:myImage]将两个UIImageView放在UIImageView中。确保对所有要合并的图像都这样做

  • 创建一个UIView,其大小与您希望最终图像的大小相同:
    UIView*myView=[[UIView alloc]initWithFrame:CGRectMake(0,0,myWidth,myHeight)]

  • 将两个UIImageView的帧设置为最终图像中所需的位置。你也可以 在这里设置不透明度<代码>myImageView.frame=CGRectMake(x,y,宽度,高度)
    myImageView.alpha=.5'

  • 将两个UIImageView添加到您创建的UIView<代码>[myView添加子视图:myImageView]

  • 现在,您需要拍摄UIView的屏幕截图。我不知道它是否真的需要在屏幕上可见才能工作。你可以两种方法都试。若它确实需要是可见的,那个么它可能并不重要,因为它会在屏幕上显示的时间比你们可以测量的时间要短。使用以下代码将屏幕截图存储到UIImage中(由于某些原因,我无法将其正确格式化):

    UIGraphicsBeginImageContext(self.myView.bounds.size)
    [self.myView.layer renderContext:UIGraphicsGetCurrentContext()]
    UIImage*finalImage=UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

  • 如果不希望出现任何警告,您还需要在类的顶部添加行
    #import


    在那里,您的组合图像存储在
    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;
    }
    
    添加时,请确保分别添加红色、绿色、蓝色和Alpha。如果增加值大于255,则将其上限设置为255。根据您的使用情况,忽略Alpha。例如:

    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;
    

    UInt32*newPixel=reds+(greens我最终使用了与长时间曝光相同的方法


    通过“堆叠其像素值”,你的意思是只把一个放在另一个上面,没有不透明的东西,对吗?不,我的意思是字面上把它们加在一起。就像一个像素一个像素地把两个图像中像素的RGB值加在一起一样?你能不能把它们一个放在另一个上面,把顶部的一个设置为.5 alpha?如果你想把它们都放在一个图像中您仍然可以按照以下步骤进行操作。“堆栈”和“合并”之间有什么区别,它们和加法有什么不同?Sry,我试着给某个东西命名,但我不知道它叫什么。也许它们都一样,但我想我已经说得很清楚了,我想在photoshop中实现屏幕层属性。哦,这不是你的意思。听起来很好!看起来正是我需要的。我会尝试一下周末结束了。如果你遇到问题,请在这里发布。在像素级玩图像很有趣。但不容易。好吧,我被卡住了。我如何迭代像素阵列?我的意思是,我如何获得它的长度?添加了
    cgbitmapcontextgetbytesperow(ctx)和CGBitmapContextGetHeight(ctx)
    UInt32 *newPixel = reds + (greens << 8) + (blues << 16); // put in an alpha here if you want
    copyofpixels[n] = newPixel;