2010-11-19 7 views
12

Ich verwende CorePlot, um verschiedene Graphen in meiner Anwendung zu zeichnen. Dann möchte ich dieses Diagramm in eine JPG-Datei speichern und auf einer sozialen Netzwerkseite (z. B. Twitter) veröffentlichen.So speichern Sie eine von CorePlot erstellte Grafik in eine JPG-Datei

Ich habe einige Unterlagen lesen und zu verstehen, dass die folgenden Methoden für mich nützlich sein könnten:

  • CGBitmapContextCreateImage: eine CGImage als Kopie von einem Bitmap-Grafikkontext zu schaffen (dh die Ansicht, in der mein Graph gelegen oder den ganzen Bildschirm - habe ich verstanden rechts)

  • CGImageCreateWithImageInRect: ich des Bildes einen Teil ausschneiden kann, wenn

  • benötigt
  • [UIImage imageWithCGImage? ]: CGImage auf ein UIImage Objekt

  • UIImageJPEGRepresentation Umwandlung: mein UIImage Objekt in ein jpg NSData Objekt umzuwandeln, die dann kann ich

    1. Die erste Frage zu meinem sozialen Netzwerk teilen ist: haben verstanden, ich Recht, die Reihenfolge der Operationen, die ich ausführen muss, um meine Aufgabe zu erfüllen? Ich hätte es aus mir selbst versucht, aber ich habe ein Problem, das auf die zweite Frage führt:

    2. Von wo bekomme ich die Info-Grafikkontext in CGBitmapContextCreateImage passieren, wenn ich CorePlot verwende? Entschuldigung, wenn es eine dumme Frage ist, aber ich bin nicht wirklich mit Grafikkontexten zu Hause.

Vielen Dank für jede Hilfe im Voraus! Und wenn ich mit all dem irgendwo komme, verspreche ich, hier mein Codebeispiel zu posten. Nun

dank Brad, es war wirklich einfach, aber wie ich versprochen, ich habe die Zeilen schreiben:

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

Als eine Randnotiz, haben Sie png anstelle von jpg in Betracht gezogen? Es könnte für computergenerierte Grafiken wie Diagramme besser sein. – ustun

Antwort

20

Eigentlich ist die CPlayer Basisklasse für alle Zeichenelemente in Kern Plot hat eine Kategorie Methode -imageOfLayer genannt verwendet, die eine UIImage-Instanz zurückgibt auf welcher Ebene Sie es auch nennen. Sehen Sie die CPPlatformSpecificCategories.h und CPPlatformSpecificCategories.m Dateien im Framework, wenn Sie sehen möchten, wie dies erreicht wird.

Verwenden Sie einfach -imageOfLayer auf Ihrer CPGraph-Instanz und verwenden Sie dann UIImageJPEGRepresentation(), um die JPEG-Version dieses Bildes zu erstellen. Sie können dieses Bild dann mit den üblichen Mitteln hochladen.

Ebenso gibt es eine -dataForPDFRepresentationOfLayer-Methode, die eine NSData-Instanz zurückgibt, die eine PDF-Darstellung des Layers und seiner Sublayer enthält.

+0

JA !!! war einfach so einfach, danke! – Arts

+0

HALLO. IS dieses mögliche ganze Diagramm-Bild. Ich habe nur 320 X 460. Visible Diagramm-Bild. Ich will volles Diagramm-Bild ..? Wie kann ich es bekommen...? –

2

Ich weiß nicht viel über CorePlot. Aber ich nehme an, dass CorePlot eine Ansicht bereitstellt, die ein Diagramm für sich selbst rendert. Wenn CorePlot keinen Mechanismus zur Verfügung stellt, um eine UIImage des Graphen zu erhalten, dann können Sie CorePlot wahrscheinlich dazu bringen, in Ihren eigenen Bitmap-Grafikkontext zu zeichnen, aus dem Sie ein Bildobjekt zum Speichern erstellen können.

Hier ist der Grundansatz:

1) Erstellen einer Bitmapgrafikkontext UIGraphicsBeginImageContext() verwenden. Dies wird auch den Kontext zum "aktuellen" Kontext machen. Sie könnten auch CGBitmapContextCreate() verwenden, aber dann müssten Sie auch UIGraphicsPushContext() verwenden, um es aktuell zu machen.

2) Rufen Sie die CorePlot-Ansicht drawRect: Methode.

3) erhalten Sie das Bild aus dem Kontext Grafiken UIGraphicsGetImageFromCurrentImageContext()

4) aufzuräumen mit UIGraphicsEndImageContext()

5) erhalten mit Ihrer Jpeg Bits in ein NSData Objekt mit UIImageJPEGRepresentation().

6) speichern/laden Sie Ihre jpeg mit NSData Methoden (oder andere ..)