2010-11-19 18 views
12

Sto utilizzando CorePlot per disegnare diversi grafici nella mia applicazione. Quindi, vorrei salvare questo grafico in un file jpg e pubblicarlo su un sito di social network (ad esempio, Twitter).Come salvare un grafico creato da CorePlot in un file jpg

ho fatto qualche lettura di documentazione e capito che i seguenti metodi potrebbero essere utili per me:

  • CGBitmapContextCreateImage: la creazione di un CGImage come una copia da un contesto grafico bitmap (vale a dire, la vista dove il mio grafico è situato o l'intero schermo - ho capito a destra)

  • CGImageCreateWithImageInRect: posso tagliare fuori una parte dell'immagine, se necessario

  • [UIImage imageWithCGImage? ]: La conversione CGImage ad un oggetto UIImage

  • UIImageJPEGRepresentation: convertire il mio oggetto UIImage a un oggetto NSData jpg che poi posso condividere alla mia rete sociale

    1. La prima domanda è: Ho capito il diritto sequenza di operazioni che devo eseguire per portare a termine il mio compito? Avrei provato io stesso, ma ho avuto un problema che porta alla seconda domanda:

    2. Da dove posso ottenere informazioni contesto grafico di passare in CGBitmapContextCreateImage se sto usando CorePlot? Scusa se è una domanda stupida, ma non sono davvero a casa con contesti grafici.

Grazie mille per qualsiasi aiuto in anticipo! E se prendo tutto questo da qualche parte, prometto di pubblicare il mio codice qui.

Bene, grazie a Brad, è stato davvero facile, ma come ho promissed, devo inviare le righe:

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

Come nota a margine, hai considerato png anziché jpg? Potrebbe essere meglio per la grafica generata al computer come i grafici. – ustun

risposta

20

In realtà, la classe base CPLayer utilizzato per tutti gli elementi di disegno in Nucleo trama ha un metodo categoria chiamata -imageOfLayer che restituisce un'istanza di UIImage qualunque strato tu lo chiami. Vedere i file CPPlatformSpecificCategories.h e CPPlatformSpecificCategories.m nel framework se si desidera vedere come ciò viene realizzato.

Utilizzare semplicemente -imageOfLayer nell'istanza CPGraph e quindi utilizzare UIImageJPEGRepresentation() per creare la versione JPEG di tale immagine. È quindi possibile caricare l'immagine utilizzando i mezzi normali.

Allo stesso modo, esiste un metodo -dataForPDFRepresentationOfLayer che restituisce un'istanza NSData contenente una rappresentazione PDF del livello e dei relativi sottolivelli.

+0

SI !!! è stato così facile, grazie! – Arts

+0

HI .. È questa immagine del grafico intero possibile .. ho solo 320 X 460 .. Immagine del grafico visibile .. voglio immagine completa del grafico ..? come posso averlo...? –

2

io non so molto di CorePlot. Ma suppongo che CorePlot fornisca una vista che restituisce un grafico a se stesso. Se CorePlot non fornisce un meccanismo per ottenere un valore UIImage del grafico, è probabile che sia possibile ingannare CorePlot nel disegno nel proprio contesto grafico bitmap, dal quale è possibile creare un oggetto immagine da salvare.

Ecco l'approccio di base:

1) creare un contesto grafico bitmap utilizzando UIGraphicsBeginImageContext(). Ciò renderà anche il contesto il contesto "attuale". Potresti anche usare CGBitmapContextCreate() ma dovresti anche usare UIGraphicsPushContext() per renderlo attuale.

2) chiamare il metodo drawRect: della vista CorePlot.

3) ottenere l'immagine dal contesto grafico usando UIGraphicsGetImageFromCurrentImageContext()

4) pulire con UIGraphicsEndImageContext()

5) mettere le punte JPEG in un oggetto NSData utilizzando UIImageJPEGRepresentation().

6) salvare/caricare il tuo jpeg utilizzando NSData metodi (o altro ..)

Problemi correlati