Цель c iPhone UIImage преобразована в PNG PPI/DPI слишком высоко

Я генерирую UIImage как таковой:

//scale UIView size to match underlying UIImage size
float scaleFactor = 10.0

UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, scaleFactor);

[self.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage* image = UIGraphicsGetImageFromCurrentImageContext();

UIImage имеет размер 3200x2400, что я и хочу. Однако при преобразовании в формат PNG для отправки в виде вложения электронной почты:

NSData* data = UIImagePNGRepresentation(image);

MFMailComposeViewController* controller;
...
[controller addAttachmentData:data mimeType:mimeType fileName:.fileName];

Я получаю изображение 720 ppi и, следовательно, ~12.8mb. Что слишком велико.

Я не знаю, откуда исходит 720 ppi, UIImage генерируется из изображения с разрешением 72 ppi. Это должно быть как-то связано с:

UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque,scaleFactor);

Мне нужно создать UIImage из UIView на основе лежащего в основе UIImage (который намного больше, чем границы UIView), но мне нужно сохранить исходный ppi. 720 точек на дюйм слишком непрактично для вложений электронной почты.

Какие-нибудь мысли?

3 ответа

Ваш scaleFactor является too high который results в large image data, DecreasescaleFactor а затем сделать снимок экрана.

В основном это должно быть

float scaleFactor = 1.0;

Конвертировать в PNG как:

 NSData *imageData = UIImagePNGRepresentation(imagehere);

Прикрепить imageData к почте.

РЕДАКТИРОВАТЬ: изменить размер изображения, как это:

 UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 1.0);
 [yourimageview.image drawInRect:CGRectMake(0,0,self.bounds.size)];
 UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

Согласно рекомендации eagle.dan.1349, я попробовал следующее:

-(UIImage*)convertViewToImage
{
    UIImage* retVal = nil;

    //create the graphics context
    CGSize imageSize = targetImage.size;
    CGSize viewSize = self.bounds.size;

    //CGSize cvtSize = CGSizeMake(imageSize.width/viewSize.width,            imageSize.height/viewSize.height);
    float scale = imageSize.width/viewSize.width;

    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, scale);

    //write the contents of this view into the context
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];

    //get the image
    retVal = UIGraphicsGetImageFromCurrentImageContext();

    //close the graphics context
    UIGraphicsEndImageContext();

    NSData* data = UIImageJPEGRepresentation(retVal, 0.0);
    [retVal release];
    retVal = [UIImage imageWithData:data];

    return retVal;
}

* Позже я исполняю:

NSData* data = UIImagePNGRepresentation(image);

Однако, как я уже упоминал, это все равно приводит к изображению размером 5,8 МБ, поэтому я подозреваю, что где-то около 300 пикселей на дюйм.

Мне нужен UIImage, созданный из UIView, с требуемым разрешением и размером (72 ppi,3200X2400). Должен быть способ сделать это.

Во-первых, мне интересно, как ваше устройство не плачет от кровавых слез от таких изображений HD. Когда я работал над проектом, связанным с изображениями, такое высокое разрешение в PNG вызывало много проблем с совместным использованием в социальных сетях и отправкой по электронной почте, поэтому мы перешли на JPEG. Кроме того, обычно не рекомендуется отправлять изображения в сети в формате PNG, лучше сделать это в формате JPEG с надлежащим сжатием. Однако, если вам необходимо использовать PNG, вы можете сделать этот трюк: сначала преобразовать его в данные JPEG, инициализировать ваше изображение с этими данными, а затем преобразовать его в PNG.

Изменить: Кроме того, попробуйте установить только размер контекста, который вам нужен, 320X240 и масштабировать не до 10, а до 0, чтобы система определяла требуемый масштаб. Это может помочь. Затем просто масштабируйте полученный UIImage еще раз.

Другие вопросы по тегам