我正在尝试在Apple Script Editor中编写JXA脚本,将PNG文件转换为base64字符串,然后添加到JSON对象中。
我似乎找不到适用于执行base64编码/解码的JXA方法。
我发现一个使用Shell脚本编写的滴答程序,它将任务外包给openssl,然后输出.b64文件:
但是它导致以下错误: $.NSData.alloc.UIImagePNGRepresentation不是一个函数。(在“$.NSData.alloc.UIImagePNGRepresentation(image)”中,“$.NSData.alloc.UIImagePNGRepresentation”未定义)
我猜这是因为UIImagePNGRepresentation属于UIKit框架,这是iOS的东西而不是OS X?
我发现this post,它建议使用以下内容:
我似乎找不到适用于执行base64编码/解码的JXA方法。
我发现一个使用Shell脚本编写的滴答程序,它将任务外包给openssl,然后输出.b64文件:
for f in "$@"
do
openssl base64 -in "$f" -out "$f.b64"
done
所以我在考虑将其改造为一种方法,使用evalAS来运行内联AppleScript,就像这个例子:
(() => {
'use strict';
// evalAS2 :: String -> IO a
const evalAS2 = s => {
const a = Application.currentApplication();
return (a.includeStandardAdditions = true, a)
.runScript(s);
};
return evalAS2(
'use scripting additions\n\
for f in' + '\x22' + file + '\x22\n'
do
openssl base64 -in "$f" -out "$f.b64"
done'
);
})();
然后在脚本中重新打开.b64文件,但这一切似乎都很冗长和笨拙。
我知道可以在JXA脚本中使用Cocoa,我看到Cocoa中有base64编码/解码方法...
以及Objective-C:
NSData *imageData = UIImagePNGRepresentation(myImageView.image);
NSString * base64String = [imageData base64EncodedStringWithOptions:0];
JXA Cookbook有一个完整的章节介绍调用ObjC函数的语法,我正在阅读它。据我理解,它应该像这样:
var image_to_convert = $.NSData.alloc.UIImagePNGRepresentation(image)
var image_as_base64 = $.NSString.alloc.base64EncodedStringWithOptions(image_to_convert)
但我完全是个新手,所以对于这些内容理解起来仍然很困难。
在上面的推测代码中,我不确定从哪里获取图像数据?
我目前正在尝试:
ObjC.import("Cocoa");
var image = $.NSImage.alloc.initWithContentsOfFile(file)
console.log(image);
var image_to_convert = $.NSData.alloc.UIImagePNGRepresentation(image)
var image_as_base64 = $.NSString.alloc.base64EncodedStringWithOptions(image_to_convert)
但是它导致以下错误: $.NSData.alloc.UIImagePNGRepresentation不是一个函数。(在“$.NSData.alloc.UIImagePNGRepresentation(image)”中,“$.NSData.alloc.UIImagePNGRepresentation”未定义)
我猜这是因为UIImagePNGRepresentation属于UIKit框架,这是iOS的东西而不是OS X?
我发现this post,它建议使用以下内容:
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。我只是决心让某些东西工作。
我希望有一种方法可以在普通的JavaScript中完成,在JXA脚本中也能运行?
期待您能提供任何答案和/或指针。提前感谢您所有人!
NSBitmapImageRep
是表示PNG、JPG等图像的对象。对于您的任务来说,它是不必要的,因为您已经有了文件,只想将其作为Base64字符串获取。我编辑了答案并添加了var theString = ObjC.unwrap(image_as_base64);
。似乎没有这些步骤,您无法访问该值。这些代码应该适用于任何类型的文件。 - ivion