Objective-C / Какао для JXA - PullRequest
       33

Objective-C / Какао для JXA

0 голосов
/ 12 июня 2019

Мне нужно преобразовать файл PNG в данные Base64, чтобы я мог добавить его в объект JSON, используя JXA (сценарии приложения JavaScript).

JXA ограничен по сравнению с обычным JavaScript, поэтому я не могунемедленно используйте функции из FileReader и т. д.

Из того, что я прочитал, я не знаю, как это сделать без использования Objective-C / Cocoa (который я только началчитая сегодня об этой задаче).

Я нашел следующий код в другом сообщении :

NSArray *keys = [NSArray arrayWithObject:@"NSImageCompressionFactor"];
NSArray *objects = [NSArray arrayWithObject:@"1.0"];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

NSImage *image = [[NSImage alloc] initWithContentsOfFile:[imageField stringValue]];
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]];
NSData *tiff_data = [imageRep representationUsingType:NSPNGFileType properties:dictionary];

NSString *base64 = [tiff_data encodeBase64WithNewlines:NO];

Я считаю, что это имеет отношение к тому, что я пытаюсь сделать- Кто-нибудь знает, как я могу соединить этот метод, чтобы использовать его в JXA?

Я читал в разделе Поваренная книга JXA на Синтаксис для вызова функций ObjC ,но мне трудно это понять ... это все, что я до сих пор придумал:

var desktopString = app.pathTo("desktop").toString()
var file = `${desktopString}/test.png`

ObjC.import("Cocoa");
var image = $.NSImage.alloc.initWithContentsOfFile(file)
var imageRep = $.NSBitmapImageRep.alloc.initWithData(image)

Но я не знаю, как поступить - меня сбивает с толку:

  • Весь начальный NSArray / NSDictionary part
  • TIFFПредставление (оно мне нужно?Куда мне его поместить?)
  • NSData * tiff_data = [imageRep presentationUsingType: NSPNGFileType properties: dictionary]; (Нет ассигнований! Зачем нужен словарь?)
  • NSString * base64 = [tiff_data encodeBase64WithNewlines: NO]; (Опять же, без выделения.)

Я был бы очень признателен, если бы кто-то мог указать мне правильное направление / дать мненесколько советов о том, как мне добиться того, что я пытаюсь сделать.

Заранее спасибо!

1 Ответ

0 голосов
/ 17 июня 2019

Преобразование файла изображения в представление NSImage, а затем в строку base-64 - большая работа, и она была применима только к ответу, который вы получили, потому что ОП там исходил из NSImage данные класса. Поскольку вы заявили, что у вас есть файл .png, маршрут намного проще:

ObjC.import('Foundation');


function fileToBase64(filepath) {
    const standardizedPath = $.NSString.stringWithString(filepath)
                                       .stringByStandardizingPath;
    const base64String = $.NSData.dataWithContentsOfFile(standardizedPath)
                                 .base64EncodedStringWithOptions(0);

    return ObjC.unwrap(base64String);
}


(() => {
    return fileToBase64('~/Desktop/test.png');
})();

Для справки, это возвращает идентичный вывод следующей команде оболочки bash:

base64 --input ~/Desktop/test.png

PS. Для удобства изучения, несмотря на то, чему учит JXA Cookbook, старайтесь не импортировать всю инфраструктуру Cocoa в свои сценарии, а просто импортировать те, которые относятся к используемым вами классам target-c.

...