我试图在Apple脚本编辑器中编写JXA脚本,该脚本将PNG文件转换为base64字符串,然后可以将其添加到JSON对象。
我似乎找不到适合做base64编码/解码部分的JXA方法。
我遇到了一个droplet which was written using Shell Script,它将任务外包给openssl,然后输出一个.b64文件:
for f in "$@"
do
openssl base64 -in "$f" -out "$f.b64"
done
因此,我想到了弗兰肯斯坦(Frankenstein)将其扩展为使用evalAS到run inline 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文件,但是这一切似乎漫长而笨拙。
我知道可以使用Cocoa in JXA scripts,并且我看到base64 encoding/decoding in Cocoa的方法...
以及Objective-C:
NSData *imageData = UIImagePNGRepresentation(myImageView.image);
NSString * base64String = [imageData base64EncodedStringWithOptions:0];
JXA Cookbook的整个章节都覆盖了Syntax for Calling ObjC functions,我正在尝试阅读。
据我了解,它看起来应该像这样:
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)
但这会导致以下错误:
我猜是因为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。我只是下定决心要工作。
我希望有某种方法可以在可以在JXA脚本中运行的普通旧JavaScript中做到这一点?
我期待您可能提供的任何答案和/或指示。谢谢大家!
最佳答案
抱歉,我从未使用过JXA,但是在Objective-C中工作了很多。
我认为您遇到了编译错误,因为您试图始终分配新的对象。
我认为这应该是简单的:
ObjC.import("Cocoa");
var imageData = $.NSData.alloc.initWithContentsOfFile(file);
console.log(imageData);
var image_as_base64 = imageData.base64EncodedStringWithOptions(0); // Call method of allocated object
对于Base64编码而言,0是一个常数,以仅获取base64字符串。
edit:
var theString = ObjC.unwrap(image_as_base64);
使值对JXA可见