图片分辨率太高,有时候直接放在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)];
这样可以适配大小