Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JXA/JavaScript中将PNG编码/解码为base64字符串_Javascript_Cocoa_Base64_Applescript_Javascript Automation - Fatal编程技术网

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

在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';

我试图在Apple脚本编辑器中编写一个JXA脚本,将PNG文件转换为base64字符串,然后将其添加到JSON对象中

我似乎找不到一个JXA方法可以用于base64编码/解码部分

我遇到一个将任务外包给openssl,然后输出一个.b64文件:

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);