AVISO: Cualquier pregunta que no cumpla ninguno de estos criterios podrá ser borrada sin previo aviso.

Hola a todos,

en el desarrollo que estoy realizando necesito poder escribir texto sobre una UIImage, he encontrado un código que me lo permite realizar, pero el caso es que no está pensado para imprimir caracteres especiales como las tildes. ¿Sabéis de qué manera puedo refactorizar este código para que escriba texto con caracteres especiales en la UIImage?

Link al snippet

//Add text to UIImage
-(UIImage *)addText:(UIImage *)img text:(NSString *)text1{
    int w = img.size.width;
    int h = img.size.height; 
    //lon = h - lon;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1);

    char* text  = (char *)[text1 cStringUsingEncoding:NSASCIIStringEncoding];// "05/05/09";
    CGContextSelectFont(context, "Arial", 18, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode(context, kCGTextFill);
    CGContextSetRGBFillColor(context, 255, 255, 255, 1);

    //rotate text
    CGContextSetTextMatrix(context, CGAffineTransformMakeRotation( -M_PI/4 ));

    CGContextShowTextAtPoint(context, 4, 52, text, strlen(text));

    CGImageRef imageMasked = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    return [UIImage imageWithCGImage:imageMasked];
}

La parte de rotar el texto me es innecesaria.

Un saludo.

preguntado 23 Ago '11, 13:27

torhector2's gravatar image

torhector2
290353743

He avanzado algo, he conseguido mostrar los caracteres especiales mediante

UIGraphicsPushContext(context);
    [text1 drawAtPoint:CGPointMake(posX, 180.0) withFont:[UIFont fontWithName:@"Helvetica" size:36]];

//rotate text
    CGContextSetTextMatrix(context, CGAffineTransformMakeRotation( -M_PI));

Y eliminando

CGContextSelectFont(context, "Arial", 18, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode(context, kCGTextFill);

Pero ahora sale el texto como en el reflejo de un espejo, sólo necesito invertir ese efecto ¿Cómo puedo hacerlo?

(23 Ago '11, 15:30) torhector2

Deberías actualizar tu post principal en vez de añadir otro mensaje al tema.

(23 Ago '11, 20:13) Xavier Jurado ♦

CGContextShowTextAtPoint solo entiende de dos encoding: kCGEncodingMacRoman y kCGEncodingFontSpecific, para escribir la mayoría de los acentos podrías utilizas MacRoman, pero entonces deberías convertir tu NSString a char* con el encoding correcto (quizá utilizando kCFStringEncodingMacRoman con CFStringConvertEncodingToNSStringEncoding() y luego tu llamada a cStringUsingEncoding:).

Pero mi recomendación es que utilices algo de más alto nivel en vez de QuarzCore. La solución que apuntas utilizando drawAtPoint:withFont: es mucho más sencilla y soporta todo el rango Unicode sin necesidad de conversiones ni otras lindezas. De hecho, utilizando métodos de alto nivel, el bloque de código queda muy sencillo:

UIGraphicsBeginImageContextWithOptions(img.size, NO, 0.0f);
[img drawAtPoint:CGMakePoint(0.0f, 0.0f)];
[text1 drawAtPoint: ...];
UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Y creo que obtendrías el mismo resultado.

enlace permanente

respondido 23 Ago '11, 22:39

YoNoSoyTu's gravatar image

YoNoSoyTu
4.7k1963

Al final esta opción ha resultado a la primera y desde luego es un método mucho más sencillo que el que estaba utilizando. Muchas gracias.

(24 Ago '11, 08:49) torhector2

En Core Graphics el origen de coordenadas se encuentra en la parte inferior izquierda de la ventana. En UIKit, en cambio, se sitúa en la parte superior izquierda. Como estás utilizando un método de UIKit (la extensión de NSString para imprimir texto en pantalla) dentro de un contexto de Core Graphics, los orígenes de coordenadas no coinciden y el texto se dibuja invertido.

Para solucionar este problema peudes invertir el eje 'y' de tu contexto CG:

CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0, -1.0));
enlace permanente

respondido 23 Ago '11, 20:12

Xavier%20Jurado's gravatar image

Xavier Jurado ♦
3.6k12043

Intenté aplicarle una matriz ayer pero no resultó, desconozco los motivos :S Muchas gracias por contestar, un saludo.

(24 Ago '11, 08:48) torhector2
Tu respuesta:
Activar/desactivar vista previa

Sobre esta pregunta

Etiquetas de la pregunta:

×57
×15
×5

Pregunta realizada el: 23 Ago '11, 13:27

Pregunta visitada: 1,515 veces

Última modificación: 24 Ago '11, 09:53

Seguir esta pregunta

Por Email:

Una vez que entres podrás suscribirte desde aquí para recibir actualizaciones

Por RSS:

Respuestas

Respuestas y Comentarios

Realizar Donación