Objective c 目标c iPhone UIImage转换为PNG PPI/DPI太高

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*

我正在生成这样的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倍是没有意义的