7

NSImage cocoa オブジェクトの base64 文字列表現を作成する必要があります。これを処理する最善の方法は何ですか。アップルのドキュメントは、この件に関して少し不足しているようです (または、私はそれを見つけることができません)。Base64 エンコーディングは、外から見るとかなり複雑に見えます。

どんな助けでも大歓迎です。

乾杯アレックス

編集

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];
4

6 に答える 6

4

NSImage は非常に抽象的なオブジェクトです。NSImage は、それがラスター画像かベクター画像かはあまり気にしません。NSImage オブジェクトは、ラスター、ベクター、さらにはプログラムによる表現を一度にすべて持つことができます。これは一般的なことです。

Base64 データを生成する前に、をエンコードするかを決定する必要があります。

最初のステップは、ラスターとベクターのどちらをエンコードするかを決定することです。前者は非常に簡単で、おそらくあなたの意図通りだと思います。ただし、NSImage は、PDF ドキュメントなどのベクター ソースから取得された可能性があります。

ラスター ソースから画像を作成したことがわかっている場合は、そのソース データをエンコードするだけです。

ベクトルソースから来た場合でも、デコード側のアプリケーションがそれを処理できることがわかっていれば、そのままエンコードできます (たとえば、別の Cocoa または Cocoa Touch アプリの場合)。一方、デコード側のアプリがベクター データを処理できない可能性がある場合は、この方法を避ける必要があります。

すべてのケースで機能する 1 つの解決策は、 NSBitmapImageRepを使用して画像のラスター キャプチャを作成することです。画像にフォーカスをロックし、そのメソッドを使用して NSBitmapImageRep を作成し、フォーカスをロック解除します。次に、representationUsingType:properties:を使用して、画像の PNG (または適切な形式) データを生成します。次に、PNG (または任意の形式) データを Base64 エンコードします。

于 2009-06-01T17:12:17.993 に答える
2

github のツールキットには、OmniFoundation の実装に基づく Base64 解析を含む一連のコードがあります。特に、Extensions/NSData+Base64.h を見てください。

于 2009-06-01T16:29:52.300 に答える
2

Apple はここで特別な支援を提供していないので、何らかの方法で自分で複雑さに取り組む必要があります。

幸いなことに、これを簡単にするために利用できるリソースがいくつかあります。最初のアプローチは、文字通り自分でエンコードとデコードを行うことです。Google Toolbox for Mac にはこのアプローチの良い例があり、このソース ファイルをそのまま使用できる場合があります。

http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/Foundation/GTMBase64.m

OpenSSH ライブラリが利用可能な Mac 用にのみビルドする場合は、これらのライブラリのいくつかの関数を利用して、エンコードとデコードを行うことができます。

http://www.dribin.org/dave/blog/archives/2006/03/12/base64_cocoa/

于 2009-06-01T14:32:04.850 に答える
1

NSImage を base64 文字列に変換する Swift 2 拡張機能を次に示します。

private extension NSImage {
    var base64String:String? {
    guard let rep = NSBitmapImageRep(
        bitmapDataPlanes: nil,
        pixelsWide: Int(size.width),
        pixelsHigh: Int(size.height),
        bitsPerSample: 8,
        samplesPerPixel: 4,
        hasAlpha: true,
        isPlanar: false,
        colorSpaceName: NSDeviceRGBColorSpace,
        bytesPerRow: 0,
        bitsPerPixel: 0
        ) else {
            print("Couldn't create bitmap representation")
            return nil
    }

    NSGraphicsContext.saveGraphicsState()
    NSGraphicsContext.setCurrentContext(NSGraphicsContext(bitmapImageRep: rep))
    drawAtPoint(NSZeroPoint, fromRect: NSZeroRect, operation: .CompositeSourceOver, fraction: 1.0)
    NSGraphicsContext.restoreGraphicsState()

    guard let data = rep.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties: [NSImageCompressionFactor: 1.0]) else {
        print("Couldn't create PNG")
        return nil
    }
    return data.base64EncodedStringWithOptions([])
}
}
于 2016-07-02T23:52:14.693 に答える
1

スイフト3

extension NSImage {
    var base64String:String? {
        guard let rep = NSBitmapImageRep(
            bitmapDataPlanes: nil,
            pixelsWide: Int(size.width),
            pixelsHigh: Int(size.height),
            bitsPerSample: 8,
            samplesPerPixel: 4,
            hasAlpha: true,
            isPlanar: false,
            colorSpaceName: NSDeviceRGBColorSpace,
            bytesPerRow: 0,
            bitsPerPixel: 0
            ) else {
                print("Couldn't create bitmap representation")
                return nil
        }

        NSGraphicsContext.saveGraphicsState()
        NSGraphicsContext.setCurrent(NSGraphicsContext(bitmapImageRep: rep))
        draw(at: NSZeroPoint, from: NSZeroRect, operation: .sourceOver, fraction: 1.0)
        NSGraphicsContext.restoreGraphicsState()

        guard let data = rep.representation(using: NSBitmapImageFileType.PNG, properties: [NSImageCompressionFactor: 1.0]) else {
            print("Couldn't create PNG")
            return nil
        }

        return data.base64EncodedString(options: [])
    }
}
于 2016-09-28T13:25:51.560 に答える