конвертировать UIImage в NSData

170

Я использую этот код в своем приложении, которое поможет мне отправить изображение.

Тем не менее, у меня есть вид изображения с изображением. У меня нет файла в appbundle, но изображение на моей стороне. Как я могу изменить приведенный ниже код? Может кто-нибудь сказать мне, как я могу преобразовать 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
UIImageJPEGRepresentation, UIImagePNGR представительство оба возвращают nsdata изображения .....
Химаншу Агнихотри

Ответы:

286

Попробуйте выполнить одно из следующих действий в зависимости от формата изображения:

UIImageJPEGRepresentation

Возвращает данные для указанного изображения в формате JPEG.

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

UIImagePNGRepresentation

Возвращает данные для указанного изображения в формате PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Здесь документы .

РЕДАКТИРОВАТЬ:

если вы хотите получить доступ к необработанным байтам, которые составляют UIImage, вы можете использовать этот подход:

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

Это даст вам низкоуровневое представление изображения RGB пикселей. (Опустите CFBridgingReleaseбит, если вы не используете ARC).

Серджио
источник
8
Есть ли способ просто получить данные в любом формате, в котором они уже есть?
devios1
1
XCode предлагает мне использовать, (id)CFBridgingRelease(CGDataProviderCopyData(provider))чтобы получить право собственности на CDataRefвозвращенный CGDataProviderCopyDataв ARC.
Mostruash
1
@mostruash: спасибо, я изменил свой ответ, чтобы учесть ваше предложение.
Серхио
@sergio У меня нет опыта работы с не-ARC Obj-C, и мне интересно, dataбудет ли достаточно выпустить релиз или все еще будет утечка памяти.
Mostruash
1
Это не поможет Свойство CIImage устанавливается только в том случае, если оно было инициализировано с помощью imageWithCIImage :. Также это не непосредственно используемые данные, а скорее другой объект представления изображения.
Король-волшебник
161
NSData *imageData = UIImagePNGRepresentation(myImage.image);
основание системы счисления
источник
4
Я использую эту строку, но это очень медленно
user2128531
5
Обратите внимание, что imageFlags (например, imageOrientation) теряются при использовании UIImagePNGRepresentation. Вот почему UIImageJPEGRepresentation является предпочтительным.
Yony
26

Если у вас есть изображение внутри UIImageView, например, «myImageView», вы можете сделать следующее:

Преобразуйте ваше изображение с помощью UIImageJPEGRepresentation () или UIImagePNGRepresentation (), например так:

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).

Вы также можете поместить этот код в блок GCD и выполнить в другом потоке, показывая UIActivityIndicatorView во время процесса ...

//*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*
    });
});
FormigaNinja
источник
24

Создать ссылку на изображение ....

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

отображение изображения в виде изображения ... imagedisplay является ссылкой на изображение:

imagedisplay.image = rainyImage;

преобразовать его NSData, передав UIImageссылку и обеспечить качество сжатия в значениях с плавающей запятой:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Jemythehigh
источник
2

Решение в Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
Чарльтон Проватас
источник
Как cgImage.dataProviderданные закодированы? Кажется, что он отличается от данных UIImagePNGRepresentationи UIImageJPEGRepresentationпотому, что он не может быть использован для создания изображения, как это UIImage(data: imageData).
Мануэль
@ Мануэль Не уверен. Я только что преобразовал синтаксис из ответа Серхио. Серхио, вероятно, знал бы лучше.
Чарльтон Проватас
@ Мануэль Я предполагаю, потому что он использует CoreGraphics API и предоставляет более низкоуровневое представление данных изображения, чем UIImageJPEGRepresentationобеспечивает. Но я считаю, что это решение сохраняет исходный формат кодирования, в котором было изображение, и не перекодирует его.
Чарльтон Проватас
1

Используйте блок if-let с Data для предотвращения сбоя приложения и безопасного выполнения кода, так как функция UIImagePNGRepresentation возвращает необязательное значение.

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

Примечание. Данные относятся к классу Swift 3. Используйте данные вместо NSData с Swift 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...
     }
}
Krunal
источник
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];
    }
Джаеш Мардия
источник