在JXA/JavaScript中将PNG编码/解码为base64字符串
我试图在Apple脚本编辑器中编写一个JXA脚本,将PNG文件转换为base64字符串,然后将其添加到JSON对象中 我似乎找不到一个JXA方法可以用于base64编码/解码部分 我遇到一个将任务外包给openssl,然后输出一个.b64文件:在JXA/JavaScript中将PNG编码/解码为base64字符串,javascript,cocoa,base64,applescript,javascript-automation,Javascript,Cocoa,Base64,Applescript,Javascript Automation,我试图在Apple脚本编辑器中编写一个JXA脚本,将PNG文件转换为base64字符串,然后将其添加到JSON对象中 我似乎找不到一个JXA方法可以用于base64编码/解码部分 我遇到一个将任务外包给openssl,然后输出一个.b64文件: for f in "$@" do openssl base64 -in "$f" -out "$f.b64" done 所以我想到了弗兰肯斯坦,用evalAS的方法,根据例子: (() => { 'use strict';
for f in "$@"
do
openssl base64 -in "$f" -out "$f.b64"
done
所以我想到了弗兰肯斯坦,用evalAS的方法,根据例子:
(() => {
'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文件,但这一切似乎都相当冗长和笨拙
我知道这是可能的使用,我看到有方法
以及:
这本书有一整节要读,我正试着读一遍。
据我所知,它应该看起来像:
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.uiImagePngResentation(图像)”,
“$.NSData.alloc.UIImagePNGRepresentation”未定义)
我猜这是因为UIKit框架,这是一个iOS的东西,而不是OSX
我遇到了,这表明:
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脚本中运行
我期待您能提供任何答案和/或建议。提前谢谢大家 使用下面的代码。使用“readDataAsURL”中的FileReader将文件从jquery文件输入元素读取到var文件。然后将png作为base64格式的字符串 您可能需要将base64字符串拆分为“,”以获取字符串的实际数据部分,您可以将其包含在JSON中,并通过API将其发送到后端
var file = $('#fileUpload').prop('files')[0];
var base64data;
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function() {
base64data = reader.result;
var dataUrl = base64data.split(",");
};
通常,您将获得的base64字符串采用这种形式
”数据:图像/png;base64,一些字符的流…
所以一些字符的流…(dataUrl)实际上是图像数据所在的位置
此外,您还可以使用打开HTML页面中的图像
<img src=base64data>
很抱歉,我从未使用过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可以看到该值感谢@Anjana Senanayake,不幸的是,尽管该代码在常规JavaScript环境中工作,但在JXA中无法工作-它无法识别FileReader对象。JXA是相当有限的,所以我认为解决方案在于使用Objective-C。我只是不知道如何正确地在JXA中写出语法。不过我很感激你的努力。谢谢你,@ivion!您的更正没有出现错误-但我做错了什么,bc我无法让它返回base64数据(它似乎是某种类型的obj)。。。了解这些行吗:NSArray*keys=[NSArray arrayWithObject:@“NSImageCompressionFactor”];NSArray*对象=[NSArray arrayWithObject:@“1.0”];NSDictionary*dictionary=[NSDictionary dictionary WithObjects:objects forKeys:keys];NSBitmapImageRep*imageRep=[[NSBitmapImageRep alloc]initWithData:[image TIFFRepresentation]];NSData*tiff_数据=[imageRep表示UsingType:NSPNGFileType属性:字典];谢谢!所有这些方法都用于获取图像数据。
NSBitmapImageRep
是一个表示PNG、JPG等的对象。它对于您的任务来说是不必要的,因为您有文件,只想将其作为Base64字符串获取。我编辑了答案并添加了var theString=ObjC.unwrap(image\u as\u base64)代码>如果没有这些步骤,您似乎无法访问该值。这几行应该适用于每种类型的文件。非常感谢@ivion,我昨天一直在为这几行辛苦工作哈哈-“u da man!”
edit:
var theString = ObjC.unwrap(image_as_base64);