【问题标题】:Objective-C/Cocoa to JXAObjective-C/Cocoa 到 JXA
【发布时间】:2019-06-12 08:33:04
【问题描述】:

我需要将 PNG 文件转换为 Base64 数据,以便我可以使用 JXA(JavaScript 应用程序脚本)将其添加到 JSON 对象。

与常规 JavaScript 相比,JXA 受到限制,因此我无法立即使用 FileReader 等中的函数。

根据我的阅读,如果不使用 Objective-C/Cocoa(我今天才开始阅读有关此任务的内容),我无法知道如何做到这一点。

我在another 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 中使用它吗?

我一直在阅读Syntax for calling ObjC functions 上的JXA Cookbook's 部分,但我很难理解它......这就是我迄今为止想出的全部:

var desktopString = app.pathTo("desktop").toString()
var file = `${desktopString}/test.png`

ObjC.import("Cocoa");
var image = $.NSImage.alloc.initWithContentsOfFile(file)
var imageRep = $.NSBitmapImageRep.alloc.initWithData(image)

但我不知道如何继续 - 我被以下因素甩了:

  • 整个初始NSArray/NSDictionary部分
  • TIFFRepresentation(我需要它吗?我应该把它放在哪里?)
  • NSData *tiff_data = [imageRep representationUsingType:NSPNGFileType properties:dictionary];(没有alloc!为什么需要字典?)
  • NSString *base64 = [tiff_data encodeBase64WithNewlines:NO];(再次, 没有分配。)

如果有人能指出我正确的方向/给我一些关于如何完成我想做的事情的指示,我将非常感激。

提前谢谢你!

【问题讨论】:

    标签: objective-c cocoa base64 javascript-automation


    【解决方案1】:

    将图像文件转换为 NSImage 表示形式,然后转换为 base-64 字符串需要大量工作,并且仅适用于您提供的答案,因为那里的 OP 是从拥有 @987654322 的起点开始的@类数据。正如您所说,您有一个.png 文件,路线要简单得多:

    ObjC.import('Foundation');
    
    
    function fileToBase64(filepath) {
        const standardizedPath = $.NSString.stringWithString(filepath)
                                           .stringByStandardizingPath;
        const base64String = $.NSData.dataWithContentsOfFile(standardizedPath)
                                     .base64EncodedStringWithOptions(0);
    
        return ObjC.unwrap(base64String);
    }
    
    
    (() => {
        return fileToBase64('~/Desktop/test.png');
    })();
    

    作为参考,这将返回与以下 bash shell 命令相同的输出:

    base64 --input ~/Desktop/test.png
    

    PS。为了便于学习,尽管 JXA Cookbook 教了什么,但尽量不要将整个 Cocoa 框架导入到您的脚本中,而只导入特定于您正在使用的 Objective-c 类的那些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-21
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多