Цель 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
, Decrease
scaleFactor
а затем сделать снимок экрана.
В основном это должно быть
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 еще раз.