ইউএসআইজিটিকে এনএসডিটাতে রূপান্তর করুন


170

আমি আমার অ্যাপটিতে এই কোডটি ব্যবহার করছি যা আমাকে একটি চিত্র প্রেরণে সহায়তা করবে।

যাইহোক, আমি একটি ইমেজ সঙ্গে একটি চিত্র দেখুন। আমার অ্যাপবান্ডলে কোনও ফাইল নেই তবে আমার পাশের চিত্রটি রয়েছে। আমি কীভাবে নীচের কোডটি পরিবর্তন করতে পারি? কেউ কি বলতে পারবে আমি রূপান্তর করতে পারেন myimageকরতে NSData?

// Attach an image to the email
NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];

2
ইউআইজিএজেজেপিজেইগ্রেশন, ইউআইআইজিএজপিএনজি সম্প্রসারণ উভয়ই চিত্রটির এনএসডা ফিরিয়ে দেয় .....
হিমাংশু

উত্তর:


286

আপনার চিত্র বিন্যাসের উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করে দেখুন:

UIImageJPEGRepresentation

জেপিইজি ফর্ম্যাটে নির্দিষ্ট চিত্রের জন্য ডেটা ফেরত দেয়।

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNGRepresentation

পিএনজি ফর্ম্যাটে নির্দিষ্ট চিত্রের ডেটা ফেরত দেয়

NSData * UIImagePNGRepresentation (
   UIImage *image
);

এখানে ডক্স

সম্পাদনা করুন:

আপনি যদি ইউআইজিমেজ তৈরির কাঁচা বাইটগুলি অ্যাক্সেস করতে চান তবে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

এটি আপনাকে আরজিবি পিক্সেল চিত্রের নিম্ন-স্তরের উপস্থাপনা দেবে। ( CFBridgingReleaseআপনি যদি আরসি ব্যবহার না করেন তবে বিট ছাড়ুন)।


8
এটি ইতিমধ্যে যে ফর্ম্যাটটিতে রয়েছে কেবলমাত্র তথ্য পাওয়ার কোনও উপায় আছে?
ডিভাইস 1

1
এক্সকোড আমাকে এআরসি-র মাধ্যমে ফেরতের (id)CFBridgingRelease(CGDataProviderCopyData(provider))মালিকানা নিতে ব্যবহার করার পরামর্শ দেয় । CDataRefCGDataProviderCopyData
Mostruash

1
@ মোস্ট্রুশ: ধন্যবাদ, আমি আপনার পরামর্শটি আমলে নেওয়ার জন্য আমার উত্তরটি পরিবর্তন করেছি।
সার্জিও

@ সেরজিও আমি নন-এআরসি ওবজ-সি নিয়ে অভিজ্ঞ নই এবং আমি ভাবছি যে অবমুক্ত dataকরা যথেষ্ট হবে বা এখনও স্মৃতি ফাঁস হতে পারে কিনা।
Mostruash

1
এই সাহায্য করবে না। বৈশিষ্ট্য সিআইআইমেজ কেবল তখনই সেট করা থাকে যদি তা চিত্রের সাথে ইনিশিয়েশন করা হয় উইথসিআইএমেজ :. এছাড়াও এটি সরাসরি ব্যবহৃত ডেটা নয় বরং অন্য চিত্রের উপস্থাপনা অবজেক্ট।
কিং-উইজার্ড

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
আমি এই লাইনটি ব্যবহার করছি তবে এটি খুব ধীর
ব্যবহারকারী 2128531

5
নোট করুন যে ইউআইআইমেজপিএনজিআরসিপ্রেজেশন ব্যবহার করার সময় ইমেজফ্লেগগুলি (যেমন চিত্র ওরিয়েন্টেশন) হারিয়ে যায়। এজন্যই ইউআইআইএমএজেজেপিইজি প্রেরণকে অগ্রাধিকার দেওয়া হয়।
ইয়নি

26

আপনার যদি কোনও ইউআইআইমেজভিউয়ের মধ্যে একটি চিত্র থাকে, যেমন "মাই আইজামভিউ", আপনি নিম্নলিখিতটি করতে পারেন:

আপনার চিত্রটিকে ইউআইআইজেজজেপিপিগ্রিফেরেশন () বা ইউআইআইমেজ পিএনজি উপস্থাপনা () ব্যবহার করে রূপান্তর করুন:

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

আপনি এই কোডটি একটি জিসিডি ব্লকের ভিতরে রাখতে পারেন এবং প্রক্রিয়া চলাকালীন একটি ইউআইএসিএটিভিটি ইন্ডিকেটরভিউ দেখিয়ে অন্য থ্রেডে চালিত করতে পারেন ...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});

24

চিত্রের রেফারেন্স তৈরি করুন ....

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

চিত্র দর্শনে চিত্র প্রদর্শন করা হচ্ছে ... চিত্রযুক্ত চিত্রটি চিত্রের ভিউয়ের রেফারেন্স:

imagedisplay.image = rainyImage;

রেফারেন্স NSDataপাস করে এটিকে রূপান্তর করুন UIImageএবং ভাসমান মানগুলিতে সংক্ষেপণের গুণমান সরবরাহ করুন:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

সুইফট 4-এ সমাধান

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

কিভাবে cgImage.dataProviderডেটা এনকোড করা হয়? এটি এর ডেটা থেকে আলাদা বলে মনে হয় UIImagePNGRepresentationএবং UIImageJPEGRepresentationকারণ এটি এর মতো চিত্র তৈরি করতে ব্যবহার করা যায় না UIImage(data: imageData)
ম্যানুয়েল

@ ম্যানুয়েল নিশ্চিত নয় আমি সেরজিওর উত্তর থেকে বাক্য গঠনটি কেবল রূপান্তর করেছি। সার্জিও সম্ভবত আরও ভাল জানতেন।
চার্লটন Provatas

@ ম্যানুয়েল আমি ধরে নিচ্ছি কারণ এটি কোরগ্রাফিক্স এপিআই ব্যবহার করছে এটি যা UIImageJPEGRepresentationসরবরাহ করে তার চেয়ে চিত্রের নিম্ন-স্তরের ডেটা উপস্থাপনা দিচ্ছে । তবে আমি বিশ্বাস করি যে এই সমাধানটি মূল এনকোডিং ফর্ম্যাটটি সংরক্ষণ করে যা চিত্রটি ছিল এবং এটি পুনরায় এনকোড করে না।
চার্লটন Provatas

1

অ্যাপ্লিকেশন ক্রাশ এবং কোডের নিরাপদ বাস্তবায়ন রোধ করতে ডেটা দিয়ে আইফ্লক ব্লক ব্যবহার করুন, যেমন ইউআইআইমেজ পিএনজি সম্প্রসারণ একটি alচ্ছিক মান প্রদান করে।

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

দ্রষ্টব্য: ডেটা হ'ল সুইফ্ট 3 শ্রেণি। সুইফট 3 সহ এনএসডিটার পরিবর্তে ডেটা ব্যবহার করুন

জেনেরিক চিত্র অপারেশন (যেমন png এবং jpg উভয়):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

এক্সটেনশন ব্যবহার করে:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

0
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.