UIImage+Resizing.m 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //
  2. // UIImage+Resize.m
  3. // NYXImagesKit
  4. //
  5. // Created by @Nyx0uf on 02/05/11.
  6. // Copyright 2012 Nyx0uf. All rights reserved.
  7. // www.cocoaintheshell.com
  8. //
  9. #import "UIImage+Resizing.h"
  10. @implementation UIImage (NYX_Resizing)
  11. -(UIImage*)cropToSize:(CGSize)newSize usingMode:(NYXCropMode)cropMode
  12. {
  13. const CGSize size = self.size;
  14. CGFloat x, y;
  15. switch (cropMode)
  16. {
  17. case NYXCropModeTopLeft:
  18. x = y = 0.0f;
  19. break;
  20. case NYXCropModeTopCenter:
  21. x = (size.width - newSize.width) * 0.5f;
  22. y = 0.0f;
  23. break;
  24. case NYXCropModeTopRight:
  25. x = size.width - newSize.width;
  26. y = 0.0f;
  27. break;
  28. case NYXCropModeBottomLeft:
  29. x = 0.0f;
  30. y = size.height - newSize.height;
  31. break;
  32. case NYXCropModeBottomCenter:
  33. x = newSize.width * 0.5f;
  34. y = size.height - newSize.height;
  35. break;
  36. case NYXCropModeBottomRight:
  37. x = size.width - newSize.width;
  38. y = size.height - newSize.height;
  39. break;
  40. case NYXCropModeLeftCenter:
  41. x = 0.0f;
  42. y = (size.height - newSize.height) * 0.5f;
  43. break;
  44. case NYXCropModeRightCenter:
  45. x = size.width - newSize.width;
  46. y = (size.height - newSize.height) * 0.5f;
  47. break;
  48. case NYXCropModeCenter:
  49. x = (size.width - newSize.width) * 0.5f;
  50. y = (size.height - newSize.height) * 0.5f;
  51. break;
  52. default: // Default to top left
  53. x = y = 0.0f;
  54. break;
  55. }
  56. CGRect cropRect = CGRectMake(x * self.scale, y * self.scale, newSize.width * self.scale, newSize.height * self.scale);
  57. /// Create the cropped image
  58. CGImageRef croppedImageRef = CGImageCreateWithImageInRect(self.CGImage, cropRect);
  59. UIImage* cropped = [UIImage imageWithCGImage:croppedImageRef scale:self.scale orientation:self.imageOrientation];
  60. /// Cleanup
  61. CGImageRelease(croppedImageRef);
  62. return cropped;
  63. }
  64. /* Convenience method to crop the image from the top left corner */
  65. -(UIImage*)cropToSize:(CGSize)newSize
  66. {
  67. return [self cropToSize:newSize usingMode:NYXCropModeTopLeft];
  68. }
  69. -(UIImage*)scaleByFactor:(float)scaleFactor
  70. {
  71. CGSize scaledSize = CGSizeMake(self.size.width * scaleFactor, self.size.height * scaleFactor);
  72. return [self scaleToFillSize:scaledSize];
  73. }
  74. -(UIImage*)scaleToFillSize:(CGSize)newSize
  75. {
  76. const size_t destWidth = (size_t)(newSize.width * self.scale);
  77. const size_t destHeight = (size_t)(newSize.height * self.scale);
  78. /// Create an ARGB bitmap context
  79. CGContextRef bmContext = NYXCreateARGBBitmapContext(destWidth, destHeight, destWidth * kNyxNumberOfComponentsPerARBGPixel);
  80. if (!bmContext)
  81. return nil;
  82. /// Image quality
  83. CGContextSetShouldAntialias(bmContext, true);
  84. CGContextSetAllowsAntialiasing(bmContext, true);
  85. CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);
  86. /// Draw the image in the bitmap context
  87. UIGraphicsPushContext(bmContext);
  88. CGContextDrawImage(bmContext, CGRectMake(0.0f, 0.0f, destWidth, destHeight), self.CGImage);
  89. UIGraphicsPopContext();
  90. /// Create an image object from the context
  91. CGImageRef scaledImageRef = CGBitmapContextCreateImage(bmContext);
  92. UIImage* scaled = [UIImage imageWithCGImage:scaledImageRef scale:self.scale orientation:self.imageOrientation];
  93. /// Cleanup
  94. CGImageRelease(scaledImageRef);
  95. CGContextRelease(bmContext);
  96. return scaled;
  97. }
  98. -(UIImage*)scaleToFitSize:(CGSize)newSize
  99. {
  100. /// Keep aspect ratio
  101. size_t destWidth, destHeight;
  102. if (self.size.width > self.size.height)
  103. {
  104. destWidth = (size_t)newSize.width;
  105. destHeight = (size_t)(self.size.height * newSize.width / self.size.width);
  106. }
  107. else
  108. {
  109. destHeight = (size_t)newSize.height;
  110. destWidth = (size_t)(self.size.width * newSize.height / self.size.height);
  111. }
  112. if (destWidth > newSize.width)
  113. {
  114. destWidth = (size_t)newSize.width;
  115. destHeight = (size_t)(self.size.height * newSize.width / self.size.width);
  116. }
  117. if (destHeight > newSize.height)
  118. {
  119. destHeight = (size_t)newSize.height;
  120. destWidth = (size_t)(self.size.width * newSize.height / self.size.height);
  121. }
  122. return [self scaleToFillSize:CGSizeMake(destWidth, destHeight)];
  123. }
  124. -(UIImage*)scaleToCoverSize:(CGSize)newSize
  125. {
  126. /// Keep aspect ratio
  127. size_t destWidth, destHeight;
  128. if (self.size.width > self.size.height)
  129. {
  130. destWidth = (size_t)newSize.width;
  131. destHeight = (size_t)(self.size.height * newSize.width / self.size.width);
  132. }
  133. else
  134. {
  135. destHeight = (size_t)newSize.height;
  136. destWidth = (size_t)(self.size.width * newSize.height / self.size.height);
  137. }
  138. return [self scaleToFillSize:CGSizeMake(destWidth, destHeight)];
  139. }
  140. @end