【问题标题】:After changing image size, image's transparent part became black更改图像大小后,图像的透明部分变黑
【发布时间】:2018-02-17 09:39:39
【问题描述】:

我正在尝试根据我的观点更改图像大小,因此我为此编写了此代码。

 -(UIImage *)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
    // Create a bitmap context.
    UIGraphicsBeginImageContextWithOptions(newSize, YES, [UIScreen mainScreen].scale);
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

    NSData *imageData = UIImagePNGRepresentation(newImage);
    UIGraphicsEndImageContext();


    UIImage *img=[UIImage imageWithData:imageData];

    return img;

}

它工作正常,但是当我得到图像时,它的透明部分变成黑色,也许它正在将它转换为 jpg。我使用了PNG图像。有任何想法吗?提前致谢。

【问题讨论】:

    标签: ios objective-c iphone uiimage


    【解决方案1】:

    参考https://developer.apple.com/documentation/uikit/1623912-uigraphicsbeginimagecontextwitho?language=objc

    方法:

    void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
    

    不透明的地方

    不透明 指示位图是否不透明的布尔标志。如果您知道位图是完全不透明的,请指定 YES 以忽略 Alpha 通道并优化位图的存储。指定 NO 意味着位图必须包含一个 Alpha 通道来处理任何部分透明的像素。

    您使用此函数来配置绘制环境以渲染为位图。位图的格式是使用主机字节顺序的 ARGB 32 位整数像素格式。如果 opaque 参数为 YES,则忽略 alpha 通道并将位图视为完全不透明 ( kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host )。否则,每个像素使用预乘 ARGB 格式 ( kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host )。

    对于透明图像,您应该将 opaque 设置为 NO

    【讨论】:

      【解决方案2】:

      您应该使用NO 作为第二个参数,用于切换图像的透明度。

      UIGraphicsBeginImageContextWithOptions(newSize, NO, [UIScreen mainScreen].scale);
      

      查看Apple's documentation了解更多详情。

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多