0
点赞
收藏
分享

微信扫一扫

[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)];

  这样可以适配大小

举报

相关推荐

0 条评论