Как сохранить графику, созданную CorePlot, в файл jpg
Я использую CorePlot для рисования разных графиков в моем приложении. Затем я хотел бы сохранить этот график в файле jpg и опубликовать на сайте социальной сети (например, Twitter).
Я прочитал несколько документов и понял, что для меня могут быть полезны следующие методы:
-
CGBitmapContextCreateImage: создание CGImage как копии из растрового графического контекста (т.е. представление, где находится мой график или весь экран - я правильно понял?)
-
CGImageCreateWithImageInRect: я могу скопировать какую-то часть изображения при необходимости
-
[UIImage imageWithCGImage]: преобразование CGImage в объект UIImage
-
UIImageJPEGRепредставление: преобразование моего объекта UIImage в объект NSData jpg, который затем я могу поделиться с моей социальной сетью
-
Первый вопрос: правильно ли я понял последовательность операций, которые я должен выполнить для выполнения своей задачи? Я бы попробовал это сам, но у меня есть проблема, которая приводит к второму вопросу:
-
Откуда я могу получить информацию о графическом контексте в CGBitmapContextCreateImage, если я использую CorePlot? Извините, если это тупой вопрос, но я действительно не дома с графическими контекстами.
Большое спасибо за любую помощь заранее! И если я получу все это где-то, я обещаю разместить здесь свой пример кода.
Хорошо, спасибо Брэду, это было очень просто, но, как я и обещал, я должен опубликовать строки:
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
Собственно, базовый класс CPLayer, используемый для всех элементов чертежа в Core Plot, имеет метод категории -imageOfLayer
, который возвращает экземпляр UIImage любого уровня, на который вы его называете. См. Файлы CPPlatformSpecificCategories.h
и CPPlatformSpecificCategories.m
в фреймворке, если вы хотите увидеть, как это делается.
Просто используйте -imageOfLayer
на вашем экземпляре CPGraph, а затем используйте UIImageJPEGRepresentation()
, чтобы создать версию JPEG этого изображения. Затем вы можете загрузить это изображение, используя обычные средства.
Аналогично, существует метод -dataForPDFRepresentationOfLayer
, который возвращает экземпляр NSData, содержащий PDF-представление слоя и его подслоев.
Ответ 2
Я не знаю много о CorePlot. Но я предполагаю, что CorePlot предоставляет представление, которое отображает график для себя. Если CorePlot не предоставляет механизм для получения UIImage
графика, вы можете, вероятно, обмануть CorePlot в рисование в собственный графический контекст Bitmap, из которого вы можете создать объект изображения для сохранения.
Вот базовый подход:
1) создайте графический контекст растровой графики, используя UIGraphicsBeginImageContext()
. Это также сделает контекст "текущим" контекстом. Вы также можете использовать CGBitmapContextCreate()
, но тогда вам также нужно будет использовать UIGraphicsPushContext()
, чтобы сделать его актуальным.
2) вызовите метод представления CorePlot drawRect:
.
3) получить изображение из контекста графики, используя UIGraphicsGetImageFromCurrentImageContext()
4) очистите с помощью UIGraphicsEndImageContext()
5) получите ваши Jpeg-биты в объект NSData
, используя UIImageJPEGRepresentation()
.
6) сохранить/загрузить jpeg с помощью методов NSData
(или других).