Как сохранить графику, созданную COREPLOT в файл JPG

StackOverflow https://stackoverflow.com/questions/4226990

  •  26-09-2019
  •  | 
  •  

Вопрос

Я использую COREPLOT, чтобы нарисовать разные графики в моем приложении. Затем я хотел бы сохранить этот график к файлу JPG и публиковать на некоторых социальных сетей (например, Twitter).

Я сделал некоторую документацию по чтению и понял, что следующие методы могут быть полезны для меня:

  • CGBitmapContextCreateImage: Создание CJIMAGE в качестве копии из растрового графического контекста (т. Е. Вид, где мой граф расположен или весь экран - я понял правильно?)

  • CGIMAGECREATEWITHIMAGEINRECT: я могу погибло какую-то часть изображения, если это необходимо

  • Uiimage ImageWithCGImage]: преобразование CJIMage в объект Uiimage

  • UiimagejpegreSentation: преобразование моего объекта Uiimage на объект jpg nsdata, который тогда я могу поделиться в мою социальную сеть

    1. Первый вопрос: я правильно понял последовательность операций, которые я должен выполнить, чтобы выполнить мою задачу? Я бы попробовал себя, но у меня есть проблема, которая приводит к второму вопросу:

    2. Откуда у меня есть графическая контекстная информация, чтобы перейти в 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 Методы (или другие ..)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top