javascript - 在 JXA/JavaScript 中将 PNG 编码/解码为 base64 字符串
问题描述
我正在尝试在 Apple 脚本编辑器中编写一个 JXA 脚本,将 PNG 文件转换为 base64 字符串,然后可以将其添加到 JSON 对象中。
我似乎找不到适用于执行 base64 编码/解码部分的 JXA 方法。
我遇到了一个使用 Shell 脚本编写的 droplet,它将任务外包给openssl,然后输出一个 .b64 文件:
for f in "$@"
do
openssl base64 -in "$f" -out "$f.b64"
done
因此,我正在考虑将 Frankenstein 升级为一种使用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有一整节介绍了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 不是函数。(在 '$.NSData.alloc.UIImagePNGRepresentation(image)' 中,'$.NSData.alloc.UIImagePNGRepresentation' 未定义)
我猜这是因为UIImagePNGRepresentation属于UIKit框架,它是 iOS 的东西,而不是 OS X?
我遇到了这篇文章,这表明:
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 脚本中工作?
我期待您能提供的任何答案和/或指示。谢谢大家!
解决方案
很抱歉,我从未使用过 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 可以看到该值
推荐阅读
- java - 每次我开始一个新项目时,我是否必须在 Android Studio 中同步 gradle 项目?
- php - 使用 php 链接到另一个 html 页面时访问被拒绝
- symfony - Jenkins - 带有环境变量的 Symfony
- apache - 使用apache mod_wsgi测试报错---windows环境
- python - 绘制 X 轴边距
- javascript - 有没有办法从 ejs 获取内容到 node-js 服务器?
- authentication - Not able to access WSO2 IoTS Device Management Console in wso2-iot-3.3.0 when logged in 'admin'
- php - Commas not found in file with php
- python - 为什么 Python 包在 IDLE 3.7 中运行而不在 Atom 中运行?
- java - 服务器在套接字中关闭后,我可以与同一个客户端建立自动先前连接吗