Стек два UIImages к одному - PullRequest
       30

Стек два UIImages к одному

1 голос
/ 05 ноября 2011

Я ищу способ сложить два UIImages.Я не хочу просто объединять их (добавлять одно над другим), я скорее хочу складывать их значения пикселей.
Мои знания заканчиваются получением данных на UIImageJPEGRepresentation(), но это не главное.Мне нужны необработанные данные изображений обоих изображений и создать третье изображение со сложенными данными.
Я действительно ценю любую помощь здесь.: /

Редактировать:
Я разговаривал с моим коллегой, и он отметил, что это что-то вроде свойства слоя экрана в фотошопе.Может быть, это проясняет, что я имею в виду.

Ответы [ 3 ]

0 голосов
/ 03 мая 2012

Вы можете получить растровое изображение для каждого из изображений, используя что-то вроде:

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;
}

(обратите внимание выше, что вы не можете изменять данные пикселей, я считаю, что они неизменны. Вы должны записать копию или новый массив, а затем создать UIImage из этого растрового изображения, используя CGBitmapContextCreateImage(ctx);)

Вот как вы можете получить доступ к данным пикселей:

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;

Надеюсь, это поможет.

0 голосов
/ 19 июля 2012

В итоге я использовал тот же метод, что и подделка длинной выдержки.

поддельная длинная выдержка @ stackoverflow

0 голосов
/ 05 ноября 2011

Если я правильно понимаю, о чем вы спрашиваете, вы можете сделать это, упорядочив изображения так, как вам бы хотелось, в UIView, а затем сделать «снимок экрана» UIView и сохранить его в UIImage.

  1. Поместите оба UIImage в UIImageViews с помощью UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];.Обязательно сделайте это для всех изображений, которые вы хотите объединить.

  2. Создайте UIView с размером, который вы хотите, чтобы конечное изображение имело: UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, myWidth, myHeight)];

  3. Установите кадры обоих UIImageViews там, где вы хотите их в конечном изображении.Вы также можете установить непрозрачность здесь.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.Надеюсь, это поможет, скажите мне, если это было не то, что вы просили.

...