दिलचस्प पोस्ट
सर्वलेट एप्लिकेशन में अपलोड की गई फ़ाइलों को सहेजने का अनुशंसित तरीका Qt में QWidget पर प्रभाव धुंधला विशिष्ट उपयोगकर्ता इनपुट तक डुप्लिकेट जावा के साथ सेलेनियम वेबड्रायवर का उपयोग कर एक नया टैब कैसे खोल सकता है? क्या अप्रयुक्त फ़ंक्शन ऑप्टिमाइज़ हो रहे हैं? PHP URL से चित्र सहेज रहा है XML पर डेटासेट कन्वर्ट करें Jsoup के साथ लॉगिन फ़ॉर्म सबमिट करने में समस्याएं कमांड लाइन या बैच फ़ाइल से Excel मैक्रोज चलाने का तरीका? मैं PHP में किसी स्ट्रिंग को नंबर पर कैसे रूपांतरित कर सकता हूं? मुझे PHP में templating सिस्टम का उपयोग क्यों करना चाहिए? 403 निषिद्ध बनाम 401 अनधिकृत HTTP प्रतिक्रियाएं स्थानीय चर, एक उदाहरण फ़ील्ड, एक इनपुट पैरामीटर और एक क्लास फील्ड के बीच अंतर क्या है? हमें एक वक्तव्य के बजाय तैयार किए गए स्टेटमेंट का उपयोग कब करना चाहिए? कोको के लिए निर्भरता इंजेक्शन ढांचे?

एक नई फ़ाइल के रूप में एनएसआईमेज को कैसे सहेजना है

मैं एक नई निर्देशिका (png, jpg, …) के रूप में एक NSImage को कैसे एक निश्चित निर्देशिका में सहेज सकता हूं?

वेब के समाधान से एकत्रित समाधान "एक नई फ़ाइल के रूप में एनएसआईमेज को कैसे सहेजना है"

ऐसा कुछ करो:

NSBitmapImageRep *imgRep = [[image representations] objectAtIndex: 0]; NSData *data = [imgRep representationUsingType: NSPNGFileType properties: nil]; [data writeToFile: @"/path/to/file.png" atomically: NO]; 

आप इस तरह NSImage करने के लिए एक श्रेणी जोड़ सकते हैं

 @interface NSImage(saveAsJpegWithName) - (void) saveAsJpegWithName:(NSString*) fileName; @end @implementation NSImage(saveAsJpegWithName) - (void) saveAsJpegWithName:(NSString*) fileName { // Cache the reduced image NSData *imageData = [self TIFFRepresentation]; NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData]; NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:1.0] forKey:NSImageCompressionFactor]; imageData = [imageRep representationUsingType:NSJPEGFileType properties:imageProps]; [imageData writeToFile:fileName atomically:NO]; } @end 

"TIFF Representation" के लिए कॉल आवश्यक है अन्यथा आपको मान्य छवि नहीं मिल सकती है।

आप के बाकी के बारे में निश्चित नहीं है, लेकिन मैं अपनी पूरी एनचिलडा खाने को पसंद करता हूं। क्या ऊपर वर्णित है काम करेगा और इसके साथ कुछ भी गलत नहीं है, लेकिन मुझे कुछ चीजें मिल गईं हैं I यहां मैं अपने टिप्पणियों को उजागर करूंगा:

  • पहला सबसे अच्छा प्रतिनिधित्व प्रदान किया जाता है जो 72 डीपीआई लगता है, भले ही छवि संकल्प उस से अधिक हो। तो आप संकल्प खो रहे हैं
  • दूसरा, मल्टी पेज छवियों के बारे में जो कि एनिमेटेड जीआईएफ या पीडीएफ में हैं आगे बढ़ो, एक एनिमेटेड जीआईएफ़ का प्रयास करें, आपको एनीमेशन खोया मिलेगा
  • अन्ततः किसी भी मेटाडेटा जैसे कि EXIF, जीपीएस, आदि … डेटा खो जाएगा

इसलिए यदि आप उस छवि को परिवर्तित करना चाहते हैं, तो क्या आप वास्तव में इस सब पर खोना चाहते हैं? यदि आप अपना पूरा भोजन खाना चाहते हैं, तो इस पर पढ़ें …

कभी-कभी और मेरा मतलब है कि कभी-कभी अच्छा ओले पुराने स्कूल के विकास से बेहतर कुछ नहीं होता है हाँ, इसका मतलब है कि हमें कुछ काम करना है!

आएँ शुरू करें:

मैं NSData में एक श्रेणी बना रहा हूँ ये क्लास विधियों हैं क्योंकि आप इन चीजों को थ्रेड सुरक्षित मानते हैं और स्टैक पर अपना सामान डालने से कुछ भी सुरक्षित नहीं है। दो प्रकार के तरीके हैं, एक गैर-बहु-पृष्ठ छवियों के उत्पादन के लिए और एक बहु-पृष्ठ छवियों के उत्पादन के लिए।

एकल छवियों की सूची: जेपीजी, पीएनजी, बीएमपी, जेपीईजी -2000

एकाधिक छवियों की सूची: पीडीएफ, जीआईएफ, टीआईएफएफ

पहले मेमोरी में एक अस्थायी डाटा स्पेस बनाएं।

 NSMutableData * imageData = [NSMutableData data]; 

दूसरा एक CGImageSourceRef मिलता है हाँ बदसूरत लग पहले से ही यह नहीं है। यह बुरा नहीं है, चलो चलते रहें … आप सचमुच स्रोत छवि को एक प्रतिनिधित्व या एनएसआईमाइज का हिस्सा नहीं चाहते हैं। हालांकि, हमारे पास एक छोटी सी समस्या है स्रोत संगत नहीं हो सकता है, इसलिए सुनिश्चित करें कि आप अपने यूटीआई को CGImageSourceCopyTypeIdentifiers ()

कुछ कोड:

 CGImageSourceRef imageSource = nil; if ( /* CHECK YOUR UTI HERE */ ) return CGImageSourceCreateWithURL( (CFURLRef)aURL, nil ); NSImage * anImage = [[NSImage alloc] initWithContentsOfURL:aURL]; if ( anImage ) return CGImageSourceCreateWithData( (CFDataRef)[anImage TIFFRepresentation], nil ); 

एक सेकेंड रुको, एनएसआईमेज क्यों है? वैसे कुछ प्रारूप हैं जो मेटाडेटा नहीं है और सीजीआईमेज़ सोर्स का समर्थन नहीं करता है, लेकिन ये मान्य छवियां हैं। एक उदाहरण पुरानी शैली पीआईसीटी छवियों है।

अब हमारे पास एक CGImageSourceRef है, सुनिश्चित करें कि यह शून्य नहीं है और फिर हमें एक CGImageDestinationRef मिलें। वाह इन सभी रेफरी का ट्रैक रखने के लिए है अब तक हम 2 पर हैं!

हम इस फ़ंक्शन का उपयोग करेंगे: CGImageDestinationCreateWithData ()

  • पहला परम आपकी छवि डेटा है (डाली गई सीएफएमयूटेबलडेटाफ)
  • दूसरी परम आपका आउटपुट यूटीआई है, ऊपर की सूची को याद रखें। (जैसे किटीटीपीपीएनजी)
  • तीसरा परम बचाने के लिए छवियों की गिनती है एकल छवि फ़ाइलों के लिए यह 1 है अन्यथा आप बस निम्न का उपयोग कर सकते हैं:

    CGImageSourceGetCount (imageSource);

  • चौथे परम शून्य है

यह देखने के लिए जांचें कि क्या आपके पास यह CGImageDestinationRef है और अब हम अपने चित्र को स्रोत से इसमें जोड़ते हैं … इसमें कोई भी सभी मेटाडेटा शामिल होगा और संकल्प को बनाए रखेगा

एकाधिक छवियों के लिए हम लूप:

 for ( NSUInteger i = 0; i < count; ++i ) CGImageDestinationAddImageFromSource( imageDest, imageSource, i, nil ); 

एक छवि के लिए यह सूचकांक 0 पर कोड की एक पंक्ति है:

 CGImageDestinationAddImageFromSource( imageDest, imageSource, 0, nil); 

ठीक है, इसे अंतिम रूप दें जो इसे डिस्क या डाटा कंटेनर में लिखता है:

 CGImageDestinationFinalize( imageDest ); 

ताकि शुरुआत में परिवर्तनशील डाटा में हमारे सभी छवि डेटा और मेटाडेटा मौजूद हो।

हो गया क्या? लगभग, यहां तक ​​कि कचरा संग्रह के साथ भी आपको साफ करना पड़ता है! स्रोत के लिए दो रेफरी का एक याद रखें और गंतव्य के लिए एक सीएफआरईलीज करें ()

अब हम कर चुके हैं और आप जो कुछ भी समाप्त करते हैं वह एक रूपांतरित छवि है जिसमें सभी मेटाडेटा, रिज़ॉल्यूशन, आदि शामिल हैं …

मेरे एनएसडीटा श्रेणी के तरीकों इस तरह दिखते हैं:

 + (NSData *) JPGDataFromURL:(NSURL *)aURL; + (NSData *) PNGDataFromURL:(NSURL *)aURL; + (NSData *) BMPDataFromURL:(NSURL *)aURL; + (NSData *) JPG2DataFromURL:(NSURL *)aURL; + (NSData *) PDFDataFromURL:(NSURL *)aURL; + (NSData *) GIFDataFromURL:(NSURL *)aURL; + (NSData *) TIFFDataFromURL:(NSURL *)aURL; 

आकार बदलने या आईसीओ / आईसीएनएस के बारे में क्या? यह एक और दिन के लिए है, लेकिन संक्षेप में आप पहले आकार बदल रहे हैं …

  1. नए आकार के साथ एक संदर्भ बनाएं: CGBitmapContextCreate ()
  2. सूचकांक से एक छवि रेफरी प्राप्त करें: CGImageSourceCreateImageAtIndex ()
  3. मेटाडेटा की एक कॉपी प्राप्त करें: CGImageSourceCopyPropertiesAtIndex ()
  4. संदर्भ में छवि खींचें: CGContextDrawImage ()
  5. संदर्भ से पुनःआकारित छवि प्राप्त करें: CGBitmapContextCreateImage ()
  6. अब डेस्ट रेफ़ के लिए छवि और मेटाडेटा जोड़ें: CGImageDestinationAddImage ()

स्रोत में एम्बेडेड एकाधिक छवियों के लिए कुल्ला और दोहराएं।

आईसीओ और आईसीएनएस के बीच एकमात्र अंतर यह है कि एक एकल छवि है जबकि दूसरा एक फाइल में एकाधिक-चित्र है क्या आप अनुमान लगा सकते हैं कि कौन सा है ?! 😉 इन प्रारूपों के लिए आपको किसी विशेष आकार को फिर से बदलना होगा अन्यथा त्रुटि फिर से शुरू हो जाएगी। प्रक्रिया यद्यपि ठीक उसी स्थिति में है जहां आप उचित यूटीआई का उपयोग करते हैं, लेकिन रिसाइजिंग थोड़ा अधिक सख्त है।

ठीक है कि यह उम्मीद करता है कि वहां से अन्य लोगों की मदद मिलती है और आप जितना मैं अब हूं उतना ही पूरा हो गया है!

Opps, उल्लेख भूल गया जब आप NSData ऑब्जेक्ट प्राप्त करते हैं जैसे कि आप इसे चाहते हैं जैसे WriteToFile, writeToURL, या हेक एक और NSImage बनाते हैं यदि आप चाहते हैं

हैप्पी कोडिंग!

स्विफ्ट 3 का उपयोग करके पीएनजी को बचाओ

 import AppKit extension NSImage { @discardableResult func saveAsPNG(url: URL) -> Bool { guard let tiffData = self.tiffRepresentation else { print("failed to get tiffRepresentation. url: \(url)") return false } let imageRep = NSBitmapImageRep(data: tiffData) guard let imageData = imageRep?.representation(using: .PNG, properties: [:]) else { print("failed to get PNG representation. url: \(url)") return false } do { try imageData.write(to: url) return true } catch { print("failed to write to disk. url: \(url)") return false } } } 

स्विफ्ट शैली:

 if let imgRep = image?.representations[0] as? NSBitmapImageRep { if let data = imgRep.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties: [:]) { data.writeToFile("/path/to/file.png", atomically: false) } } 

स्विफ्ट 4 समाधान

 public extension NSImage { public func writePNG(toURL url: URL) { guard let data = tiffRepresentation, let rep = NSBitmapImageRep(data: data), let imgData = rep.representation(using: .png, properties: [.compressionFactor : NSNumber(floatLiteral: 1.0)]) else { Swift.print("\(self.self) Error Function '\(#function)' Line: \(#line) No tiff rep found for image writing to \(url)") return } do { try imgData.write(to: url) }catch let error { Swift.print("\(self.self) Error Function '\(#function)' Line: \(#line) \(error.localizedDescription)") } } } 

SWIFT का उपयोग करते हुए काम करने के लिए सिर्फ एक और गारंटी:

मेरे पास "इमेज वेल" है जहां उपयोगकर्ता किसी भी इमेज को छोड़ सकता है। और इस "इमेज वेल" में छवि प्रॉपर्टी (प्रकार NSImage) है, जो आउटलेट के माध्यम से एक्सेस की गई है:

 @IBOutlet weak var imageWell: NSImageView! 

और वह कोड जो इस छवि को बचाता है (आप इसे बटन कार्रवाई के अंदर रख सकते हैं) है:

 if imageWell.image != nil { let bMImg = NSBitmapImageRep(data: (imageWell?.image?.TIFFRepresentation)!) let dataToSave = bMImg?.representationUsingType(NSBitmapImageFileType.NSJPEGFileType, properties: [NSImageCompressionFactor : 1]) dataToSave?.writeToFile("/users/user/desktop/image.jpg", atomically: true) } 

दिए गए कोड की पहली पंक्ति में हम जांचते हैं कि हमारी छवि में एक छवि है।

दूसरी पंक्ति में हम उस छवि का एक बिटमैप प्रतिनिधित्व करते हैं।

तीसरी पंक्ति में हम अपने बिटमैप प्रतिवेदन को एक जेपीजी प्रकार के साथ "1" (कोई संपीड़न) पर सेट नहीं करते हैं।

चौथी पंक्ति में हमने दिए गए पथ के साथ जेपीजी डेटा को बचाया है। "परमाणु: सच" का अर्थ है कि फ़ाइल को एक टुकड़ा के रूप में सहेजा गया है और यह हमें आश्वासन देता है कि ऑपरेशन सफल होगा

एनबी: आप अपनी छवि को दूसरे प्रारूप में सहेजने के लिए, तीसरी पंक्ति में एक और एनएसबीआईटीएमएपीआईएमएफ़फ़ाइलटाइप का उपयोग कर सकते हैं। इसमें बहुत कुछ है:

 NSBitmapImageFileType.NSBMPFileType NSBitmapImageFileType.NSGIFFileType NSBitmapImageFileType.NSPNGFileType 

आदि।