2010-11-19 7 views
12

Estoy usando CorePlot para dibujar diferentes gráficos en mi aplicación. Luego, me gustaría guardar este gráfico en un archivo jpg y publicarlo en algún sitio de redes sociales (por ejemplo, Twitter).Cómo guardar un gráfico creado por CorePlot en un archivo jpg

he hecho un poco de lectura documentación y entiende que los métodos siguientes podrían ser útiles para mí:

  • CGBitmapContextCreateImage: la creación de un CGImage como una copia de un contexto gráfico de mapa de bits (es decir, la vista en mi gráfico es situado o toda la pantalla - ¿he entendido derecha)

  • CGImageCreateWithImageInRect: puedo recortar una parte de la imagen si es necesario

  • [UIImage imageWithCGImage? ]: Convertir CGImage a un objeto UIImage

  • UIImageJPEGRepresentation: convertir mi objetivo UIImage a un NSData objeto jpg que luego puedo compartir a mi red social

    1. La primera pregunta es: ¿He entendido bien la secuencia de operaciones que tengo que llevar a cabo para lograr mi tarea? Me he probado a mí mismo, pero tengo un problema que lleva a la segunda pregunta: ¿

    2. De dónde consigo la información de contexto gráfico pase a CGBitmapContextCreateImage si estoy usando CorePlot? Lo siento si es una pregunta tonta, pero no estoy realmente en casa con los contextos gráficos.

Muchas gracias por cualquier ayuda de antemano! Y si consigo todo esto en algún lado, prometo publicar mi muestra de código aquí.

Bien, gracias a Brad, que era muy fácil, pero como he prometido es deuda, tengo que publicar las líneas:

CPXYGraph *graph=[[CPXYGraph alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 

// setting up the graph 
// ... 

UIImage *newImage=[graph imageOfLayer]; 
NSData *newPNG=UIImagePNGRepresentation(newImage); // or you can use JPG or PDF 

// For test purposes I write the file to the Documents directory, but you can do whatever you want with your new .png file 
NSString *filePath=[NSString stringWithFormat:@"%@/graph.png", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]]; 

if([newPNG writeToFile:filePath atomically:YES]) 
    NSLog(@"Created new file successfully"); 
+1

Como nota al margen, ¿ha considerado png en lugar de jpg? Podría ser mejor para gráficos generados por computadora como gráficos. – ustun

Respuesta

20

En realidad, la clase base CPLayer utilizado para todos los elementos de dibujo en Terreno Core tiene un método categoría denominada -imageOfLayer que devuelve una instancia de UIImage cualquiera que sea la capa sobre la que lo invoque. Consulte los archivos CPPlatformSpecificCategories.h y CPPlatformSpecificCategories.m en el marco si desea ver cómo se logra esto.

Simplemente use -imageOfLayer en su instancia CPGraph y luego use UIImageJPEGRepresentation() para crear la versión JPEG de esa imagen. A continuación, puede subir esa imagen utilizando los medios normales.

Del mismo modo, existe un método -dataForPDFRepresentationOfLayer que devuelve una instancia de NSData que contiene una representación en PDF de la capa y sus subcapas.

+0

¡SÍ! fue tan fácil, ¡gracias! – Arts

+0

HI ... ES esta posible imagen de gráfico completo ... tengo solo 320 X 460 ... imagen de gráfico viable ... quiero una imagen de gráfico completo ...? Cómo puedo obtenerlo...? –

2

No sé mucho acerca de CorePlot. Pero asumo que CorePlot proporciona una vista que hace un gráfico a sí mismo. Si CorePlot no proporciona un mecanismo para obtener un UIImage del gráfico, entonces probablemente pueda engañar a CorePlot para que dibuje en su propio contexto de gráficos de mapa de bits, desde el cual puede crear un objeto de imagen para guardar.

Aquí está el enfoque básico:

1) crear un contexto gráfico de mapa de bits utilizando UIGraphicsBeginImageContext(). Esto también hará que el contexto sea el contexto "actual". También puede usar CGBitmapContextCreate(), pero también deberá usar UIGraphicsPushContext() para actualizarlo.

2) llame al método drawRect: de la vista CorePlot.

3) obtener la imagen del contexto gráfico usando UIGraphicsGetImageFromCurrentImageContext()

4) limpiar con UIGraphicsEndImageContext()

5) obtener los bits de JPEG en un objeto utilizando NSDataUIImageJPEGRepresentation().

6) guardar/cargar su jpeg usando métodos NSData (u otro ..)

Cuestiones relacionadas