2012-01-12 3 views
1

Что я делаю, это объединить 2 изображения в одно изображение.drawInRect performance too slow

Вот код.

UIGraphicsBeginImageContext(CGSizeMake(1024, 768)); 

[image1 drawInRect:CGRectMake(0, 0, 512, 768)]; 
[image2 drawInRect:CGRectMake(512, 0, 512, 768)]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Но drawInRect кажется слишком медленным.

Есть ли более быстрый способ объединить изображения?

+0

Почему вы пытаетесь объединить два изображения? И что означает «слишком медленно»? Вы нажимаете на большое количество пикселей. –

+0

Самый быстрый способ слияния изображений - избегать их слияния, когда вам это не нужно. Например, вы можете объединить один раз, кэшировать результат и повторно использовать изображение с этого момента, пока не изменится одно из изображений с предварительным объединением. – dasblinkenlight

+0

@KevinBallard Потому что мне это нужно. – Umgre

ответ

3

Вариант 0 - Убедитесь, что вы рисуете только тогда, когда вам нужно рисовать, и только то, что вам нужно сделать.


Вариант 1

Если вы знаете размер назначения (возможно self.frame.size?), Вы можете создать одно изображение из двух исходных изображений (расплющить) в размере назначения и избегайте интерполяции. Так что мог:

  1. Снизить памяти вам нужно
  2. Снизить количество изображений, вы должны рисовать
  3. Избегайте интерполяции (High CPU, если вы хотите, чтобы хорошо выглядеть)
  4. Посмотрите лучше - композитный может использовать интерполяцию высокого качества.

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

Вариант 2

Даже если вы хотите два изображения, и вы знаете, их размеры не изменятся, просто изменить их размера до размера они должны быть обращены на (ну, контролировать использование памяти, если вы увеличивать их).

Вариант 3

Если это не вариант, вы можете изменить состояние по CGContext «s, а также снизить качество интерполяции. Если вы привыкли к подобным преобразованиям CALayer, вы, вероятно, удовлетворены низким качеством или без интерполяции.

+1

Помогло ли ОП изменить вопрос? Кажется, это ответ на другую проблему (где интерполяция входит в это?). Я просто попал в проблему, обнаружив, что iOS drawInRect INCREDIBLY SLOW (быстрее будет рисовать пиксель за пикселем, сохранять его на диск, перезагружать его как новый файл (с диска!) И отображать его ... чем на call drawInRect :. Это безумие) – Adam

+0

@Adam no, вопрос не редактировался. интерполяция многих цветов - это то, что используется при растяжении/изменении размера.Дело в том, что изменение размера занимает много времени, но есть варианты качества и способы избежать и минимизировать скорость изменения размера. – justin

1

Одна вещь, которую вы могли бы сделать, это не реализовать -drawRect: вообще, но вместо этого у вас есть два CALayers с вашими двумя изображениями в качестве их содержимого, а затем поставьте один напротив другого. Не уверен, что это будет быстрее, но я думаю, что это возможно (поскольку CA может обрабатывать рисунок асинхронно, на графическом процессоре).