Как сохранить графику, созданную COREPLOT в файл JPG
Вопрос
Я использую COREPLOT, чтобы нарисовать разные графики в моем приложении. Затем я хотел бы сохранить этот график к файлу JPG и публиковать на некоторых социальных сетей (например, Twitter).
Я сделал некоторую документацию по чтению и понял, что следующие методы могут быть полезны для меня:
CGBitmapContextCreateImage: Создание CJIMAGE в качестве копии из растрового графического контекста (т. Е. Вид, где мой граф расположен или весь экран - я понял правильно?)
CGIMAGECREATEWITHIMAGEINRECT: я могу погибло какую-то часть изображения, если это необходимо
Uiimage ImageWithCGImage]: преобразование CJIMage в объект Uiimage
UiimagejpegreSentation: преобразование моего объекта Uiimage на объект jpg nsdata, который тогда я могу поделиться в мою социальную сеть
Первый вопрос: я правильно понял последовательность операций, которые я должен выполнить, чтобы выполнить мою задачу? Я бы попробовал себя, но у меня есть проблема, которая приводит к второму вопросу:
Откуда у меня есть графическая контекстная информация, чтобы перейти в 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");
Решение
На самом деле, базовый класс Cplayer, используемый для всех элементов рисования в основном графике, имеет метод категории, называемый -imageOfLayer
Это возвращает экземпляр Uiimage любого слоя, на котором вы это называете. Увидеть CPPlatformSpecificCategories.h
и CPPlatformSpecificCategories.m
Файлы в рамках, если вы хотите увидеть, как это достигнуто.
Просто использовать -imageOfLayer
на вашем экземпляре CPGRAP, а затем использовать UIImageJPEGRepresentation()
Чтобы создать версию JPEG этого изображения. Затем вы можете загрузить это изображение, используя нормальные средства.
Аналогично, есть -dataForPDFRepresentationOfLayer
Способ, который возвращает экземпляр NSDATA, содержащий представление PDF слоя и его подслоеров.
Другие советы
Я не знаю много о CorePlot. Но я предполагаю, что CorePlot предоставляет представление, которое делает график для себя. Если CorePlot не предоставляет механизм, чтобы получить UIImage
Графа, тогда вы, вероятно, можете обмануть COREPLOT на рисование в свой собственный контекст растровой графики, из которого вы можете создать объект изображения для сохранения.
Вот основной подход:
1) Создайте растровый графический контекст, используя UIGraphicsBeginImageContext()
. Отказ Это также сделает контекст «текущий» контекст. Вы также можете использовать CGBitmapContextCreate()
Но тогда вам также придется использовать UIGraphicsPushContext()
сделать это ток.
2) Позвоните в просмотр CorePlot drawRect:
метод.
3) Получите изображение из графического контекста, используя UIGraphicsGetImageFromCurrentImageContext()
4) очистить с UIGraphicsEndImageContext()
5) Получите биты JPEG в NSData
Объект с использованием UIImageJPEGRepresentation()
.
6) Сохранить / загрузить свой JPEG, используя NSData
Методы (или другие ..)