Подтвердить что ты не робот

Как сохранить графику, созданную 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");
4b9b3361

Ответ 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 (или других).