Pregunta

Estoy tratando de aplicar algunas transformaciones en imágenes usando un CGContextRef. Estoy usando las funciones CGContextTranslateCTM, CGContextScaleCTM y CGContextRotateCTM, pero para mantener las cosas simples, concentrémonos solo en el primero. Me preguntaba por qué el siguiente código produce exactamente la imagen original. ¿Me estoy perdiendo algo?

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

Además, después de traducir, cómo dibujar otra imagen sobre esta pero con transparencia parcial (p. ej. alfa = 0.5).

Busqué mucho pero no encontré una respuesta, cualquier ayuda es apreciada ... :)

Tenga en cuenta que estoy creando el contexto a partir de pixelData y que tempImg se crea después de la traducción. No hay nada malo en la inicialización, ya que la imagen original se está produciendo actualmente, pero el problema está en la traducción, supongo ...

¿Fue útil?

Solución

Las transformaciones al estado de los gráficos solo afectan las operaciones de dibujo posteriores: no cambian los datos de imagen existentes. Si desea aplicar transformaciones a una imagen, intente algo como esto:

  1. Cree un CGContext vacío (en iPhone, use UIGraphicsBeginImageContext)
  2. Traducir, escalar o rotar su estado gráfico
  3. Dibuje la imagen existente en ella.
  4. Obtener imagen del nuevo CGContext (en iPhone, use UIGraphicsGetImageFromCurrentImageContext)

Cuando realiza el paso 3, la imagen existente se dibuja en su nuevo contexto gráfico con las transformaciones aplicadas. El truco aquí es que para aplicar las transformaciones, tenemos que dibujar algo.

Puedes hacer algunas cosas realmente geniales con transformaciones de esta manera. Puede dibujar la mitad de su imagen, aplicar algunas transformaciones y dibujar algunas más.

Otros consejos

Como se señaló en otras respuestas, las transformaciones solo se aplican a las operaciones de dibujo posteriores; no afectan el búfer de píxeles con el que comenzó.

Entonces necesita una operación de dibujo. La solución es crear una imagen CG ; dibujar esa imagen es una operación de dibujo, por lo que estará sujeta a la matriz de transformación actual (CTM).

Paso a paso:

  1. Cree el contexto con datos de píxeles vacíos . (Si pasa NULL para los buffers, Quartz debería crearlos para usted. De todos modos, eso funciona en la Mac).
  2. Cree la imagen con los datos de píxeles que desea dibujar transformados.
  3. Transforme la marca comunitaria en el contexto.
  4. Dibuja la imagen.

Debe llamar a CGBitmapContextCreateImage () después de dibujar la imagen.

Luego puede dibujar otra imagen encima de la primera y llamar a CGBitmapContextCreateImage () nuevamente para obtener la segunda imagen. Puede configurar el alfa usando CGContextSetAlpha (ctx, alphaValue);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top