2009-06-01 18 views
6

पर एनएसआईमेज मुझे एनएसआईमेज कोको ऑब्जेक्ट का बेस 64 स्ट्रिंग प्रस्तुति बनाने की आवश्यकता है। ऐसा करने का सबसे अच्छा तरीका क्या है, सेब प्रलेखन विषय पर थोड़ा छोटा लगता है (या मैं इसे नहीं ढूंढ सकता)। बेस 64 एन्कोडिंग बाहर से जटिल है।बेस 64

किसी भी मदद की बहुत सराहना की जाएगी।

चीयर्स एलेक्स

संपादित

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

एक एनएसआईमेज एक बहुत ही सार वस्तु है। एनएसआईमेज वास्तव में परवाह नहीं करता है कि यह एक रास्टर छवि या वेक्टर छवि है; एक एनएसआईमेज ऑब्जेक्ट में रास्टर, वेक्टर, और यहां तक ​​कि प्रोग्रामेटिक प्रस्तुतियां भी एक साथ हो सकती हैं-यह सामान्य है।

बेस 64 डेटा जेनरेट करने से पहले, आपको तय करना होगा कि आप एन्कोड करना चाहते हैं।

पहला कदम यह तय करना है कि आप रास्टर या वैक्टर को एन्कोड करना चाहते हैं या नहीं। पूर्व काफी आसान है, और मुझे लगता है कि शायद यह आपके लिए क्या मतलब है। हालांकि, एक एनएसआईमेज एक वेक्टर स्रोत से आया हो सकता है, जैसे पीडीएफ दस्तावेज।

यदि आप जानते हैं कि आपने रास्टर स्रोत से छवि बनाई है, तो आप केवल उस स्रोत डेटा को एन्कोड कर सकते हैं।

यदि यह एक वेक्टर स्रोत से आया है, तो आप अभी भी एन्कोड कर सकते हैं यदि आप जानते हैं कि डिकोडिंग एंड पर एप्लिकेशन इसे संभालने में सक्षम होगा (उदाहरण के लिए, यदि यह एक और कोको या कोको टच ऐप है)। दूसरी तरफ, यदि डिकोडिंग अंत पर ऐप वेक्टर डेटा को संभालने में असमर्थ हो सकता है, तो आपको इस रणनीति से बचना चाहिए।

एक ही समाधान है कि सभी मामलों में काम करता है छवि के create a raster capture को NSBitmapImageRep उपयोग करने के लिए है। छवि पर फ़ोकस लॉक करें, फिर उस विधि का उपयोग करके एक NSBitmapImageRep बनाएं, फिर फोकस अनलॉक करें। फिर, छवि के लिए पीएनजी उत्पन्न करने के लिए representationUsingType:properties: का उपयोग करें (या जो भी प्रारूप उपयुक्त है) डेटा। फिर बेस 64-पीएनजी (या जो भी प्रारूप) डेटा एन्कोड करें।

+0

मेरा अनुमान है कि है कि एलेक्स base64 छवि सांकेतिक शब्दों में बदलना नहीं चाहता है अपने उद्देश्यों के लिए, लेकिन कुछ प्राप्तकर्ता के अनुबंध को पूरा करने के लिए, उदाहरण के लिए एक वेब सेवा। ऐसा होने पर, उसे बेस 64 की आवश्यकता होगी कि वेब सेवा की अपेक्षा क्या है (शायद जेपीजी या पीएनजी डेटा)। मुझे संदेह है कि किसी छवि को एन्कोड करने के विभिन्न तरीकों पर अटकलों की आवश्यकता है, लेकिन शायद एलेक्स एक तरफ या दूसरे की पुष्टि करेगा। – danielpunkass

+0

हे दोस्तों, मुझे लगता है कि मेरे पास base64 एन्कोडिंग dribin.org से कोड का उपयोग कर सही ढंग से काम कर रही है, लेकिन जब वर्डप्रेस फ़ाइल स्वीकार करता है और बनाता है, तो यह एक छवि नहीं है। http://alexmillsdesign.files.wordpress.com/2009/06/quickicon5.jpg मेरा मानना ​​है कि मुझे एनएसआईमेज ऑब्जेक्ट से सही डेटा नहीं मिल रहा है इसलिए मैंने अपना कोड बदल दिया जो मेरे मूल प्रश्न के संपादन में है। मैं छवि प्रोग्रामिंग के लिए नया हूँ, मैं गलत कहां जा रहा हूँ? –

+0

1. नामित स्थिरांक का उपयोग करें (NSImageCompressionFactor, नहीं @ "NSImageCompressionFactor")। 2. एनएसएनंबर उदाहरण का प्रयोग करें, एक स्ट्रिंग नहीं जिसमें दशमलव प्रतिनिधित्व होता है। 3. यह महत्वपूर्ण नहीं है, क्योंकि पीएनजी किसी भी तरह से एनएसआईमेज कॉम्प्रेशन फैक्टर का समर्थन नहीं करता है। 4. आप पीएनजी डेटा बना रहे हैं और अपलोड कर रहे हैं, जेपीईजी नहीं। या तो फ़ाइल नाम एक्सटेंशन के रूप में .png का उपयोग करें, या पीएनजी नहीं, जेपीईजी डेटा बनाएं और अपलोड करें। 5. यदि आप इसे डाउनलोड करते हैं, तो आप पाएंगे कि यह बेस 64 डेटा है। हो सकता है कि आपको वास्तव में बेस 64-एन्कोड करने की आवश्यकता न हो? –

2

एप्पल यहाँ किसी विशेष सहायता प्रदान नहीं करता है, तो आप अपने खुद के, एक ही रास्ता या किसी अन्य पर जटिलता से निपटने के लिए की क्या ज़रूरत है।

सौभाग्य से, यह आसान बनाने के लिए कुछ संसाधन उपलब्ध हैं। पहला दृष्टिकोण सचमुच एन्कोडिंग और डीकोडिंग करना है। मैक के लिए गूगल टूलबॉक्स इस दृष्टिकोण का एक अच्छा उदाहरण है और आप के रूप में है सिर्फ इस स्रोत फ़ाइल उपयोग करने में सक्षम हो सकता है:

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

आप केवल के लिए मैक, जहां OpenSSH पुस्तकालय हैं का निर्माण कर रहे हैं उपलब्ध है, तो आप उन पुस्तकालयों में कुछ कार्यों का लाभ लेने के एन्कोडिंग और डिकोडिंग करने के लिए कर सकते हैं: my toolkit on github में,

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

2

मैं OmniFoundation में कार्यान्वयन पर आधारित पार्सिंग Base64 सहित कोड का एक समूह, मिल गया है । विशेष रूप से, एक्सटेंशन/NSData + Base64.h देखें।

1

यहाँ एक स्विफ्ट 2 विस्तार एक बेस 64 स्ट्रिंग में NSImage कन्वर्ट करने के लिए है:

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([]) 
} 
} 
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: []) 
    } 
} 
संबंधित मुद्दे