Objective c 目标c iPhone UIImage转换为PNG PPI/DPI太高
我正在生成这样的UIImage:Objective c 目标c iPhone UIImage转换为PNG PPI/DPI太高,objective-c,uiimage,png,dpi,ppi,Objective C,Uiimage,Png,Dpi,Ppi,我正在生成这样的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*
//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];
我最终得到的图像是720ppi,因此约为12.8mb。太大了
我不知道720 ppi是从哪里来的,UIImage是从72 ppi的图像生成的。这一定与以下方面有关:
UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque,scaleFactor);
我需要基于基础UIImage从UIView创建一个UIImage,它比UIView的边界大得多,但我需要维护原始ppi。720PPI对于电子邮件附件来说太不切实际了
有什么想法吗 您的缩放因子太高,导致图像数据太大。减少scaleFactor,然后拍摄屏幕截图
基本上应该是这样
float scaleFactor = 1.0;
转换为类似PNG的格式:
NSData *imageData = UIImagePNGRepresentation(imagehere);
将图像数据附加到邮件
编辑:按如下方式调整图像大小:
UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 1.0);
[yourimageview.image drawInRect:CGRectMake(0,0,self.bounds.size)];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
scaleFactor太高,导致图像数据太大。减少scaleFactor,然后拍摄屏幕截图
基本上应该是这样
float scaleFactor = 1.0;
转换为类似PNG的格式:
NSData *imageData = UIImagePNGRepresentation(imagehere);
将图像数据附加到邮件
编辑:按如下方式调整图像大小:
UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 1.0);
[yourimageview.image drawInRect:CGRectMake(0,0,self.bounds.size)];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
首先,我想知道你的设备怎么不会因为这些高清图像而流下血泪。当我从事与图像相关的项目时,PNG的高分辨率在社交网络共享和发送电子邮件方面造成了很多问题,所以我们转向JPEG。 此外,一般不建议在web上发送PNG格式的图像,最好使用适当压缩的JPEG格式。 但是,如果您需要使用PNG,您可以使用这种技巧:首先将其转换为JPEG数据,使用此数据初始化图像,然后将其转换为PNG
编辑:此外,请尝试将您需要的上下文大小设置为320X240,并将比例不是设置为10,而是设置为0,以便系统确定所需的比例。这可能会有帮助。然后再缩放一次生成的UIImage。首先,我想知道你的设备怎么不会因为这些高清图像而流下血泪。当我从事与图像相关的项目时,PNG的高分辨率在社交网络共享和发送电子邮件方面造成了很多问题,所以我们转向JPEG。 此外,一般不建议在web上发送PNG格式的图像,最好使用适当压缩的JPEG格式。 但是,如果您需要使用PNG,您可以使用这种技巧:首先将其转换为JPEG数据,使用此数据初始化图像,然后将其转换为PNG
编辑:此外,请尝试将您需要的上下文大小设置为320X240,并将比例不是设置为10,而是设置为0,以便系统确定所需的比例。这可能会有帮助。然后只需再次缩放生成的UIImage。根据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.8MB的图像,所以我怀疑在300ppi附近的某个地方
我需要一个UIImage,从UIView创建,分辨率和大小为72 ppi,3200X2400。一定有办法做到这一点。根据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.8MB的图像,所以我怀疑在300ppi附近的某个地方
我需要一个UIImage,从UIView创建,分辨率和大小为72 ppi,3200X2400。一定有办法做到这一点。问题是UIView的大小是320x240。它的子视图基本上只是一个UIImage UIImageView,其大小为3200x2400。我想从UIView创建UIImage,以匹配基础UIImage的大小。问题是,我最终得到了一个PNG,转换自最终的UIImage,分辨率为720 ppi。当然,这会产生12.8MB的电子邮件附件。如果图像为72 ppi,则约为1.5 mb。问题是UIView的大小为320x240。它的子视图基本上只是一个UIImage UIImageView,其大小为3200x2400。我想从UIView创建UIImage,以匹配基础UIImage的大小。问题是,我最终得到了一个PNG,转换自最终的UIImage,分辨率为720 ppi。当然,这会产生12.8MB的电子邮件附件。如果图像为72 ppi,则为~1.5 mb。谢谢,我会尝试一下。这有点效果,但我最终的图像为~5.8 mb,因此我怀疑在300 ppi范围内。我在下面添加了一个答案,以显示我使用的代码。谢谢,我会尝试一下。这有点奏效,但我最终还是得到了一个~5.8 MB的图像,所以我怀疑在300 ppi范围内。我在下面添加了一个答案,以显示我使用的代码。上面的答案不是答案,这只是我在响应中包含代码片段的唯一方法。基础映像的初始值为72 ppi,3200x2400。因此,将结果图像的分辨率提高10倍是没有意义的。上面的答案不是答案,它只是我可以包含
响应中的代码片段。基础映像的起始值为72 ppi,3200x2400。因此,将结果图像的分辨率提高10倍是没有意义的