javascript - 在 JXA/JavaScript 中将 PNG 编码/解码为 base64 字符串

标签 javascript cocoa base64 applescript javascript-automation

我正在尝试在 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'ing 到一个使用 evalASrun 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)

但它会导致以下错误:

$.NSData.alloc.UIImagePNGRepresentation is not a function. (In '$.NSData.alloc.UIImagePNGRepresentation(image)', '$.NSData.alloc.UIImagePNGRepresentation' is undefined)

我猜这是因为 UIImagePNGRepresentationUIKit 框架,它是 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

0 是 Base64 编码的常量,只得到 base64 字符串。

edit:
var theString = ObjC.unwrap(image_as_base64);

这使值对 JXA 可见

关于javascript - 在 JXA/JavaScript 中将 PNG 编码/解码为 base64 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554974/

相关文章:

javascript - jQuery:删除文本区域中的重复字符串

iphone - 来自 JSON 的空值

html - 多个base64文件合二为一

JavaScript:#debug 指令的可能用途?

javascript - 动态调用Javascript变量

javascript - 为什么我的事件没有冒泡

javascript - 我可以将 Base64 图像安全地存储在本地存储中吗?

iphone - iOS - 如何绘制一个带有数字/字符的圆圈?

cocoa - "Building a Text Editor in 15 Minutes"引用示例不起作用

php - hmac哈希在PHP和Go中不一样