iPhone: преобразование изображения с помощью Quartz 2D - PullRequest
1 голос
/ 21 июня 2009

Я пытаюсь применить некоторые преобразования к изображениям, используя CGContextRef. Я использую функции CGContextTranslateCTM, CGContextScaleCTM и CGContextRotateCTM, но для простоты давайте сосредоточимся только на первом. Мне было интересно, почему следующий код производит именно оригинальное изображение ?! Я что-то упустил?

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef g = CGBitmapContextCreate((void*) pixelData, 
                                                       width, 
                                                       height, 
                                                       RGBA_8_BIT, 
                                                       bytesPerRow, 
                                                       colorSpace, 

                                                   kCGImageAlphaPremultipliedLast);

CGContextSetShouldAntialias(g, YES);

CGContextSetInterpolationQuality(g, kCGInterpolationHigh);

CGContextTranslateCTM( g,translateX, translateY );


CGImageRef tempImg  = CGBitmapContextCreateImage (g);
CGContextDrawImage( g, CGRectMake (0, 0, width, height), tempImg );
CGContextRelease(g);
CGColorSpaceRelease( colorSpace );

Кроме того, после перевода, как нарисовать другое изображение поверх этого, но с частичной прозрачностью (например, альфа = 0,5).

Я много искал, но не нашел ответа, любая помощь приветствуется ...:)

Обратите внимание, что я создаю контекст из pixelData, и что tempImg создается после перевода. В инициализации нет ничего плохого, поскольку в настоящее время создается исходное изображение, но проблема в переводе, я полагаю ...

Ответы [ 3 ]

5 голосов
/ 21 июня 2009

Преобразования в графическое состояние влияют только на последующие операции рисования - они не изменяют существующие данные изображения. Если вы хотите применить преобразования к изображению, попробуйте что-то вроде этого:

  1. Создание пустого CGContext (на iPhone используйте UIGraphicsBeginImageContext)
  2. Перевести, масштабировать или повернуть его графическое состояние
  3. Нарисуйте в нем существующее изображение.
  4. Получить изображение из нового CGContext (на iPhone используйте UIGraphicsGetImageFromCurrentImageContext)

Когда вы выполните шаг 3, существующее изображение будет отображено в вашем новом графическом контексте с примененными преобразованиями. Хитрость в том, что для того, чтобы применить преобразования, нам нужно что-то нарисовать.

Таким образом, с трансформациями можно делать действительно классные вещи. Вы можете нарисовать половину своего изображения, применить некоторые преобразования и нарисовать еще немного.

1 голос
/ 22 июня 2009

Как отмечено в других ответах, преобразования применяются только к последующим операциям рисования; они не влияют на буфер пикселей, с которого вы начали.

Итак, вам нужна операция рисования. Решение состоит в том, чтобы создать CGImage ; рисование этого изображения является операцией рисования, поэтому оно будет подчинено текущей матрице преобразования (CTM).

Шаг за шагом:

  1. Создать контекст с пустыми данными о пикселях. (Если вы передадите NULL для буферов, Кварц должен создать их для вас. В любом случае, это работает на Mac.)
  2. Создайте изображение с преобразованными данными пикселей, которые вы хотите нарисовать.
  3. Преобразование CTM в контексте.
  4. Нарисуйте изображение.
0 голосов
/ 21 июня 2009

Вы должны вызвать CGBitmapContextCreateImage () после , когда вы рисуете изображение.

Затем вы можете нарисовать другое изображение поверх первого и снова вызвать CGBitmapContextCreateImage (), чтобы получить второе изображение. Вы можете установить альфа, используя CGContextSetAlpha (ctx, alphaValue);

...