在 JXA/JavaScript 中将 PNG 编码/解码为 base64 字符串
Encode / Decode PNGs to base64 strings in JXA/JavaScript
我正在尝试在 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 到一个使用 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, and I see that there are methods for base64 encoding/decoding in Cocoa...
以及:
NSData *imageData = UIImagePNGRepresentation(myImageView.image);
NSString * base64String = [imageData base64EncodedStringWithOptions:0];
JXA Cookbook has a whole section going over Syntax for Calling ObjC functions,我正在尝试阅读。
据我了解,它应该类似于:
var image_to_convert = $.NSData.alloc.UIImagePNGRepresentation(image)
var image_as_base64 = $.NSString.alloc.base64EncodedStringWithOptions(image_to_convert)
但是我对这个完全是菜鸟,所以我还是很难完全理解。
在上面的推测代码中,我不确定从哪里获取 image 数据?
我目前正在尝试:
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)
我猜是因为 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?
我期待您能提供任何答案 and/or 指点。提前谢谢大家!
使用下面的代码。使用 'readDataAsURL' 中的 FileReader 从 jquery 文件输入元素读取文件到 var 文件。然后你将把你的 png 作为 base64 格式的字符串。
您可能需要用“,”拆分 base64 字符串以获取字符串的实际数据部分,您可以将其包含在 JSON 中并通过 [=28= 将其发送到后端].
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字符串就是这种形式。
'data:image/png;base64,STREAM_OF_SOME_CHARACTERS...
所以 STREAM_OF_SOME_CHARACTERS...(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 可见
我正在尝试在 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 到一个使用 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, and I see that there are methods for base64 encoding/decoding in Cocoa...
以及
NSData *imageData = UIImagePNGRepresentation(myImageView.image);
NSString * base64String = [imageData base64EncodedStringWithOptions:0];
JXA Cookbook has a whole section going over Syntax for Calling ObjC functions,我正在尝试阅读。 据我了解,它应该类似于:
var image_to_convert = $.NSData.alloc.UIImagePNGRepresentation(image)
var image_as_base64 = $.NSString.alloc.base64EncodedStringWithOptions(image_to_convert)
但是我对这个完全是菜鸟,所以我还是很难完全理解。
在上面的推测代码中,我不确定从哪里获取 image 数据?
我目前正在尝试:
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)
我猜是因为 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?
我期待您能提供任何答案 and/or 指点。提前谢谢大家!
使用下面的代码。使用 'readDataAsURL' 中的 FileReader 从 jquery 文件输入元素读取文件到 var 文件。然后你将把你的 png 作为 base64 格式的字符串。
您可能需要用“,”拆分 base64 字符串以获取字符串的实际数据部分,您可以将其包含在 JSON 中并通过 [=28= 将其发送到后端].
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字符串就是这种形式。
'data:image/png;base64,STREAM_OF_SOME_CHARACTERS...
所以 STREAM_OF_SOME_CHARACTERS...(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 可见