`

[IOS]当图片太大时,重新调整图片大小

    博客分类:
  • IOS
阅读更多

图片分辨率太高,有时候直接放在button里面会导致变形,需要重新缩放图片。

直接上代码:

.h:

@import UIKit;

@interface UIImage (PGResizeImage)

- (UIImage *)convertToGreyscale;
- (UIImage *)resizeImageToDimension:(CGSize)expectedSize;
- (UIImage *)resizeImageWithScaledToSize:(CGSize)newSize;
- (UIImage *)setResizeImageWithSize:(NSInteger)size;
- (UIImage *)waterMarkWithImage:(UIImage *)waterMark;

@end

 .m:

#import "UIImage+PGResizeImage.h"
//#import "PGLogger.h"

@implementation UIImage (PGResizeImage)

- (UIImage *)convertToGreyscale {
    int kRed = 1;
    int kGreen = 2;
    int kBlue = 4;
    
    int colors = kGreen | kBlue | kRed;
    int m_width = self.size.width;
    int m_height = self.size.height;
    
    uint32_t *rgbImage = (uint32_t *) malloc(m_width * m_height * sizeof(uint32_t));
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(rgbImage, m_width, m_height, 8, m_width * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    CGContextSetShouldAntialias(context, NO);
    CGContextDrawImage(context, CGRectMake(0, 0, m_width, m_height), [self CGImage]);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    
    uint8_t *m_imageData = (uint8_t *) malloc(m_width * m_height);
    for(int y = 0; y < m_height; y++) {
        for(int x = 0; x < m_width; x++) {
            uint32_t rgbPixel = rgbImage[y * m_width + x];
            uint32_t sum = 0,count = 0;
            if (colors & kRed) {
                sum += (rgbPixel >> 24)&255; count++;
            }
            if (colors & kGreen) {
                sum += (rgbPixel >> 16)&255; count++;
            }
            if (colors & kBlue) {
                sum += (rgbPixel >> 8)&255; count++;
            }
            m_imageData[y*m_width+x]=sum/count;
        }
    }
    free(rgbImage);
    
    uint8_t *result = (uint8_t *) calloc(m_width * m_height *sizeof(uint32_t), 1);
    for(int i = 0; i < m_height * m_width; i++) {
        result[i * 4] = 0;
        int val = m_imageData[i];
        result[i * 4 + 1]=val;
        result[i * 4 + 2]=val;
        result[i * 4 + 3]=val;
    }
    
    colorSpace = CGColorSpaceCreateDeviceRGB();
    context = CGBitmapContextCreate(result, m_width, m_height, 8, m_width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    UIImage *resultUIImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    free(m_imageData);
    [NSData dataWithBytesNoCopy:result length:m_width * m_height];
    
    return resultUIImage;
}

- (UIImage *)resizeImageToDimension:(CGSize)expectedSize {
//    DDLogInfo(@"%@ originalSize: %@, expectedSize: %@", NSStringFromSelector(_cmd), NSStringFromCGSize(self.size), NSStringFromCGSize(expectedSize));
    
    CGFloat totalExpectedSize = expectedSize.height * expectedSize.width;
    
    if (totalExpectedSize < self.size.height * self.size.width) {
        
        CGFloat ratio;
        if (self.size.width < self.size.height) {
            expectedSize = CGSizeMake(expectedSize.height, expectedSize.width);
            ratio = self.size.width / expectedSize.width;
        }
        else if (self.size.height < self.size.width) {
            ratio = self.size.height / expectedSize.height;
        }
        else {
            ratio = self.size.height / MIN(expectedSize.height, expectedSize.width);
        }
        
        CGSize newSize = CGSizeMake(self.size.width / ratio, self.size.height / ratio);
        
//        DDLogInfo(@"%@ outputSize: %@", NSStringFromSelector(_cmd), NSStringFromCGSize(newSize));
        
        UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
        [self drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        return newImage;
    }
    
    return self;
}

- (UIImage *)resizeImageWithScaledToSize:(CGSize)newSize {
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0);
    [self drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return newImage;
}

- (UIImage *)setResizeImageWithSize:(NSInteger)size {
    CGSize imageSize = self.size;
    if (imageSize.width > size || imageSize.height > size) {
        CGFloat scaleRatio = MIN( size / imageSize.width , size / imageSize.height);
        CGSize scaledSize = {imageSize.width * scaleRatio, imageSize.height * scaleRatio};
//        DDLogDebug(@"Size: %@", NSStringFromCGSize(scaledSize));
        UIGraphicsBeginImageContextWithOptions(scaledSize, NO, 0);
        [self drawInRect:CGRectMake(0, 0, scaledSize.width, scaledSize.height)];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
    }
    return self;
}

- (UIImage *)waterMarkWithImage:(UIImage *)waterMark {
    
    waterMark = [waterMark resizeImageWithScaledToSize:CGSizeMake(800, 200)];
    UIImage *watermarkedImage = nil;
    UIGraphicsBeginImageContext(self.size);
    
    [self drawAtPoint: CGPointZero];
    [waterMark drawInRect:CGRectMake(self.size.width / 2 - waterMark.size.width / 2, self.size.height / 2 - waterMark.size.height / 2, waterMark.size.width, waterMark.size.height)];
    
    watermarkedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return watermarkedImage;
}

使用:

self.checkedNormalImage = [[UIImage imageNamed:@"btn_untick"] resizeImageToDimension:CGSizeMake(16, 16)];

  这样可以适配大小

分享到:
评论

相关推荐

    iOS中SDWebImage指定缓存图片大小

    例如,当达到最大缓存大小时,可以考虑清除部分不常使用的图片。 总的来说,合理地设置SDWebImage的缓存大小可以帮助我们更有效地管理应用资源,提高用户体验。不过,需要注意的是,过度限制缓存大小可能会导致频繁...

    IOS应用源码——调整图片大小长宽的组件.zip

    使用Autolayout和Size Classes,开发者可以定义基于内容的约束,使图片视图能够根据图片的实际尺寸自动调整大小。 7. 动态调整与响应式设计: 这个组件可能还包含根据用户交互或设备特性动态调整图片大小的功能。...

    IOS截屏、拍照、缩减图片大小

    在iOS开发中,实现截屏、拍照以及缩减图片大小的功能是非常常见的需求,这些功能能够极大地提升用户体验。以下将详细介绍如何在iOS应用中实现这些功能。 ### 1. iOS 截屏功能 iOS 提供了 `...

    ios应用源码之转换iphonepng图片为标准格式src 20181210

    使用shell命令行工具如`pngcrush`或`ImageMagick`的`convert`命令,可以批量处理PNG文件,添加必要的chunk,或者调整大小以适应不同分辨率的设备。 在源码中处理图片转换时,还需要注意以下几点: - 图片压缩:在...

    iOS实现图片压缩的两种方法及图片压缩上传功能

    在iOS开发中,图片压缩是常见的需求,尤其在处理...通过合理地调整图片质量和尺寸,可以显著减少图片的存储和传输成本,同时确保用户体验不受太大影响。结合压缩技术与上传功能,能够构建高效且可靠的图片处理系统。

    移动端页面在ios中不显示图片的解决方法

    3. 对图片进行适配处理,包括压缩、裁剪和调整大小,减少加载时间和提高显示的成功率。 4. 在代码中添加错误处理和回退机制,当图片加载失败时,可以提供备用图片或提示信息。 总的来说,解决iOS设备上图片不显示的...

    ios如何解决布局太长导致部分不显示,且解决键盘覆盖文本框的问题。

    在iOS开发中,遇到布局太长导致部分内容无法显示以及键盘弹出时遮盖文本框的问题是常见的挑战。本文将详细讲解如何解决这两个问题。 首先,我们来探讨如何处理布局过长的问题。在iOS中,主要使用Auto Layout进行...

    IOS UIScrollView复用加载数据 延时加载数据

    当用户滚动时,UIScrollView会动态调整内容视图的位置,使用户始终看到屏幕中央的内容。 复用加载数据的核心概念是"cell复用"。在UITableView和UICollectionView中,每个单元格(cell)都是一个独立的对象,它们在...

    iOS中5种图片缩略技术及性能的深入探讨

    iOS有5中图片缩略技术,但是我们应该在项目中选择哪种技术呢?尤其是面对高精度图片的缩略时,方式不当可能会出现OOM。现在我们开始一一去看看这5中图片缩略技术吧,完整代码在这里ImageResizing (本地下载)。 ...

    uni-app的图片裁剪nice-cropper.rar

    在图片裁剪场景中,Canvas可以用来绘制并操作图片,如调整大小、旋转、裁剪等。 2. **FileReader API**:这个API允许JavaScript在用户选择文件后读取其内容,常用于图片的预览和处理。 3. **Image对象**:HTML5中...

    仿iOS圆角弹出框

    3. **尺寸适配**:确保对话框的大小适中,既不太大也不太小,以保持与iOS对话框的相似性。这可能需要动态计算或设置固定的宽度和高度。 4. **内容定制**:弹出框的内容可以根据需求进行定制,包括文本、按钮、...

    iOS图片拉伸小技巧

    而对于简单的颜色或图案,直接拉伸整个图片可能不会有太大问题。 总之,iOS提供了丰富的图片拉伸工具,让开发者能够根据设计需求调整图片,以达到最佳的视觉效果。正确处理图片的拉伸不仅关乎美学,还直接影响着...

    ios-实现表格视图.zip

    描述中提到,“之前有一个是通过绘制实现的表单,但是当数据量太大时必定出现奔溃”,这反映了自定义绘制方式在处理大数据量时的局限性。自定义绘制虽然灵活,但需要手动管理每个单元格的创建、复用和布局,如果处理...

    SwiftTweaks:无需重新编译即可调整iOS应用!

    即时调整您的iOS应用程序,无需等待重新编译! 您的用户将看不到您的动画研究,Sketch comp或原型。 他们将看到的是成品-因此,确保您的应用在真实设备上的感觉非常重要! 在笔记本电脑上看起来很棒的动画通常在...

    iOS相册清理项目完整可运行源码!包括相册,联系人的清理!

    1.视频太大?占用内存? 2.高质量压缩视频,为您的手机减负! 四、照片压缩 1.手机照片往往每张都很大?手机内存小,非常困扰! 2.高清压缩技术,大小减少60%以上!质量不变哦~ 五、联系人清理 1.联系人太多,好多...

    ios-TYDotIndicator.zip

    此外,TYDotIndicator可能还提供了自定义颜色、速度和大小等属性,以便开发者可以根据自己的应用风格进行调整。例如,你可以通过修改`dotColor`来改变点的颜色,通过`animationDuration`设置动画的持续时间,或者...

    ios-0代码实现引导页.zip

    在iOS开发中,Storyboard是一种图形化界面,用于布局和连接UI元素,而AutoLayout则是一种布局系统,能够自动调整界面元素的位置和大小以适应不同的屏幕尺寸和设备方向。 在KSGuidView中,开发者可以通过Storyboard...

    ios-绘画板.zip

    5. **一键清除画面**:当用户想要重新开始或者快速清空画布时,一键清除功能就显得非常方便。只需轻轻一点,整个画布就会被清空,用户可以立即开始新的创作。 除此之外,这个绘画应用可能还包含了其他高级特性,如...

    一个强大的IOS UI开发工具

    作者DuckDeck,源码ViewChaos,ViewChaos是一个强大的IOS UI开发工具,它可以帮助你定位View,找出它的Superview和subview,检查约束,同时也可以追踪你想要观察的...它太好用了,每个iOS开发者都应该使用这个工具!

    iOS中Safari浏览器select下拉列表文字太长被截断的处理方法.docx

    总结一下,解决iOS Safari浏览器中`&lt;select&gt;`下拉列表文字截断的问题,可以采用`&lt;optgroup&gt;`标签来组织选项,Safari会自动调整字体大小以适应内容,从而避免文字被截断。同时,使用`&lt;optgroup&gt;`标签不会影响到对选中...

Global site tag (gtag.js) - Google Analytics