/*
|
* This file is part of the SDWebImage package.
|
* (c) Olivier Poitrey <rs@dailymotion.com>
|
*
|
* For the full copyright and license information, please view the LICENSE
|
* file that was distributed with this source code.
|
*/
|
|
#import "SDWebImageCompat.h"
|
|
/// The scale mode to apply when image drawing on a container with different sizes.
|
typedef NS_ENUM(NSUInteger, SDImageScaleMode) {
|
/// The option to scale the content to fit the size of itself by changing the aspect ratio of the content if necessary.
|
SDImageScaleModeFill = 0,
|
/// The option to scale the content to fit the size of the view by maintaining the aspect ratio. Any remaining area of the view’s bounds is transparent.
|
SDImageScaleModeAspectFit = 1,
|
/// The option to scale the content to fill the size of the view. Some portion of the content may be clipped to fill the view’s bounds.
|
SDImageScaleModeAspectFill = 2
|
};
|
|
#if SD_UIKIT || SD_WATCH
|
typedef UIRectCorner SDRectCorner;
|
#else
|
typedef NS_OPTIONS(NSUInteger, SDRectCorner) {
|
SDRectCornerTopLeft = 1 << 0,
|
SDRectCornerTopRight = 1 << 1,
|
SDRectCornerBottomLeft = 1 << 2,
|
SDRectCornerBottomRight = 1 << 3,
|
SDRectCornerAllCorners = ~0UL
|
};
|
#endif
|
|
/**
|
Provide some common method for `UIImage`.
|
Image process is based on Core Graphics and vImage.
|
*/
|
@interface UIImage (Transform)
|
|
#pragma mark - Image Geometry
|
|
/**
|
Returns a new image which is resized from this image.
|
You can specify a larger or smaller size than the image size. The image content will be changed with the scale mode.
|
|
@param size The new size to be resized, values should be positive.
|
@param scaleMode The scale mode for image content.
|
@return The new image with the given size.
|
*/
|
- (nullable UIImage *)sd_resizedImageWithSize:(CGSize)size scaleMode:(SDImageScaleMode)scaleMode;
|
|
/**
|
Returns a new image which is cropped from this image.
|
|
@param rect Image's inner rect.
|
@return The new image with the cropping rect.
|
*/
|
- (nullable UIImage *)sd_croppedImageWithRect:(CGRect)rect;
|
|
/**
|
Rounds a new image with a given corner radius and corners.
|
|
@param cornerRadius The radius of each corner oval. Values larger than half the
|
rectangle's width or height are clamped appropriately to
|
half the width or height.
|
@param corners A bitmask value that identifies the corners that you want
|
rounded. You can use this parameter to round only a subset
|
of the corners of the rectangle.
|
@param borderWidth The inset border line width. Values larger than half the rectangle's
|
width or height are clamped appropriately to half the width
|
or height.
|
@param borderColor The border stroke color. nil means clear color.
|
@return The new image with the round corner.
|
*/
|
- (nullable UIImage *)sd_roundedCornerImageWithRadius:(CGFloat)cornerRadius
|
corners:(SDRectCorner)corners
|
borderWidth:(CGFloat)borderWidth
|
borderColor:(nullable UIColor *)borderColor;
|
|
/**
|
Returns a new rotated image (relative to the center).
|
|
@param angle Rotated radians in counterclockwise.⟲
|
@param fitSize YES: new image's size is extend to fit all content.
|
NO: image's size will not change, content may be clipped.
|
@return The new image with the rotation.
|
*/
|
- (nullable UIImage *)sd_rotatedImageWithAngle:(CGFloat)angle fitSize:(BOOL)fitSize;
|
|
/**
|
Returns a new horizontally(vertically) flipped image.
|
|
@param horizontal YES to flip the image horizontally. ⇋
|
@param vertical YES to flip the image vertically. ⥯
|
@return The new image with the flipping.
|
*/
|
- (nullable UIImage *)sd_flippedImageWithHorizontal:(BOOL)horizontal vertical:(BOOL)vertical;
|
|
#pragma mark - Image Blending
|
|
/**
|
Return a tinted image with the given color. This actually use `sourceIn` blend mode.
|
@note Before 5.20, this API actually use `sourceAtop` and cause naming confusing. After 5.20, we match UIKit's behavior using `sourceIn`.
|
|
@param tintColor The tint color.
|
@return The new image with the tint color.
|
*/
|
- (nullable UIImage *)sd_tintedImageWithColor:(nonnull UIColor *)tintColor;
|
|
/**
|
Return a tinted image with the given color and blend mode.
|
@note The blend mode treat `self` as background image (destination), treat `tintColor` as input image (source). So mostly you need `source` variant blend mode (use `sourceIn` not `destinationIn`), which is different from UIKit's `+[UIImage imageWithTintColor:]`.
|
|
@param tintColor The tint color.
|
@param blendMode The blend mode.
|
@return The new image with the tint color.
|
*/
|
- (nullable UIImage *)sd_tintedImageWithColor:(nonnull UIColor *)tintColor blendMode:(CGBlendMode)blendMode;
|
|
/**
|
Return the pixel color at specify position. The point is from the top-left to the bottom-right and 0-based. The returned the color is always be RGBA format. The image must be CG-based.
|
@note The point's x/y will be converted into integer.
|
@note The point's x/y should not be smaller than 0, or greater than or equal to width/height.
|
@note The overhead of object creation means this method is best suited for infrequent color sampling. For heavy image processing, grab the raw bitmap data and process yourself.
|
|
@param point The position of pixel
|
@return The color for specify pixel, or nil if any error occur
|
*/
|
- (nullable UIColor *)sd_colorAtPoint:(CGPoint)point;
|
|
/**
|
Return the pixel color array with specify rectangle. The rect is from the top-left to the bottom-right and 0-based. The returned the color is always be RGBA format. The image must be CG-based.
|
@note The rect's origin and size will be converted into integer.
|
@note The rect's width/height should not be smaller than or equal to 0. The minX/minY should not be smaller than 0. The maxX/maxY should not be greater than width/height. Attention this limit is different from `sd_colorAtPoint:` (point: (0, 0) like rect: (0, 0, 1, 1))
|
@note The overhead of object creation means this method is best suited for infrequent color sampling. For heavy image processing, grab the raw bitmap data and process yourself.
|
|
@param rect The rectangle of pixels
|
@return The color array for specify pixels, or nil if any error occur
|
*/
|
- (nullable NSArray<UIColor *> *)sd_colorsWithRect:(CGRect)rect;
|
|
#pragma mark - Image Effect
|
|
/**
|
Return a new image applied a blur effect.
|
|
@param blurRadius The radius of the blur in points, 0 means no blur effect.
|
|
@return The new image with blur effect, or nil if an error occurs (e.g. no enough memory).
|
*/
|
- (nullable UIImage *)sd_blurredImageWithRadius:(CGFloat)blurRadius;
|
|
#if SD_UIKIT || SD_MAC
|
/**
|
Return a new image applied a CIFilter.
|
|
@param filter The CIFilter to be applied to the image.
|
@return The new image with the CIFilter, or nil if an error occurs (e.g. no
|
enough memory).
|
*/
|
- (nullable UIImage *)sd_filteredImageWithFilter:(nonnull CIFilter *)filter;
|
#endif
|
|
@end
|