SDImageTransformerTests.m 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /*
  2. * This file is part of the SDWebImage package.
  3. * (c) Olivier Poitrey <rs@dailymotion.com>
  4. * (c) Matt Galloway
  5. *
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. #import "SDTestCase.h"
  10. #import "UIColor+SDHexString.h"
  11. #import <CoreImage/CoreImage.h>
  12. @interface SDImageTransformerTests : SDTestCase
  13. @property (nonatomic, strong) UIImage *testImageCG;
  14. @property (nonatomic, strong) UIImage *testImageCI;
  15. @end
  16. @implementation SDImageTransformerTests
  17. #pragma mark - UIImage+Transform
  18. // UIImage+Transform test is hard to write because it's more about visual effect. Current it's tied to the `TestImage.png`, please keep that image or write new test with new image
  19. - (void)test01UIImageTransformResizeCG {
  20. [self test01UIImageTransformResizeWithImage:self.testImageCG];
  21. }
  22. - (void)test01UIImageTransformResizeCI {
  23. [self test01UIImageTransformResizeWithImage:self.testImageCI];
  24. }
  25. - (void)test01UIImageTransformResizeWithImage:(UIImage *)testImage {
  26. CGSize scaleDownSize = CGSizeMake(200, 100);
  27. UIImage *scaledDownImage = [testImage sd_resizedImageWithSize:scaleDownSize scaleMode:SDImageScaleModeFill];
  28. expect(CGSizeEqualToSize(scaledDownImage.size, scaleDownSize)).beTruthy();
  29. CGSize scaleUpSize = CGSizeMake(2000, 1000);
  30. UIImage *scaledUpImage = [testImage sd_resizedImageWithSize:scaleUpSize scaleMode:SDImageScaleModeAspectFit];
  31. expect(CGSizeEqualToSize(scaledUpImage.size, scaleUpSize)).beTruthy();
  32. // Check image not inversion
  33. UIColor *topCenterColor = [scaledUpImage sd_colorAtPoint:CGPointMake(1000, 50)];
  34. expect([topCenterColor.sd_hexString isEqualToString:[UIColor blackColor].sd_hexString]).beTruthy();
  35. }
  36. - (void)test02UIImageTransformCropCG {
  37. [self test02UIImageTransformCropWithImage:self.testImageCG];
  38. }
  39. - (void)test02UIImageTransformCropCI {
  40. [self test02UIImageTransformCropWithImage:self.testImageCI];
  41. }
  42. - (void)test02UIImageTransformCropWithImage:(UIImage *)testImage {
  43. CGRect rect = CGRectMake(50, 10, 200, 200);
  44. UIImage *croppedImage = [testImage sd_croppedImageWithRect:rect];
  45. expect(CGSizeEqualToSize(croppedImage.size, CGSizeMake(200, 200))).beTruthy();
  46. UIColor *startColor = [croppedImage sd_colorAtPoint:CGPointZero];
  47. expect([startColor.sd_hexString isEqualToString:[UIColor clearColor].sd_hexString]).beTruthy();
  48. // Check image not inversion
  49. UIColor *topCenterColor = [croppedImage sd_colorAtPoint:CGPointMake(100, 10)];
  50. expect([topCenterColor.sd_hexString isEqualToString:[UIColor blackColor].sd_hexString]).beTruthy();
  51. }
  52. - (void)test03UIImageTransformRoundedCornerCG {
  53. [self test03UIImageTransformRoundedCornerWithImage:self.testImageCG];
  54. }
  55. - (void)test03UIImageTransformRoundedCornerCI {
  56. [self test03UIImageTransformRoundedCornerWithImage:self.testImageCI];
  57. }
  58. - (void)test03UIImageTransformRoundedCornerWithImage:(UIImage *)testImage {
  59. CGFloat radius = 50;
  60. #if SD_UIKIT
  61. SDRectCorner corners = UIRectCornerAllCorners;
  62. #else
  63. SDRectCorner corners = SDRectCornerAllCorners;
  64. #endif
  65. CGFloat borderWidth = 1;
  66. UIColor *borderColor = [UIColor blackColor];
  67. UIImage *roundedCornerImage = [testImage sd_roundedCornerImageWithRadius:radius corners:corners borderWidth:borderWidth borderColor:borderColor];
  68. expect(CGSizeEqualToSize(roundedCornerImage.size, CGSizeMake(300, 300))).beTruthy();
  69. UIColor *startColor = [roundedCornerImage sd_colorAtPoint:CGPointZero];
  70. expect([startColor.sd_hexString isEqualToString:[UIColor clearColor].sd_hexString]).beTruthy();
  71. // Check the left center pixel, should be border :)
  72. UIColor *checkBorderColor = [roundedCornerImage sd_colorAtPoint:CGPointMake(1, 150)];
  73. expect([checkBorderColor.sd_hexString isEqualToString:borderColor.sd_hexString]).beTruthy();
  74. // Check rounded corner operation not inversion the image
  75. UIColor *topCenterColor = [roundedCornerImage sd_colorAtPoint:CGPointMake(150, 20)];
  76. expect([topCenterColor.sd_hexString isEqualToString:[UIColor blackColor].sd_hexString]).beTruthy();
  77. }
  78. - (void)test04UIImageTransformRotateCG {
  79. [self test04UIImageTransformRotateWithImage:self.testImageCG];
  80. }
  81. - (void)test04UIImageTransformRotateCI {
  82. [self test04UIImageTransformRotateWithImage:self.testImageCI];
  83. }
  84. - (void)test04UIImageTransformRotateWithImage:(UIImage *)testImage {
  85. CGFloat angle = M_PI_4;
  86. UIImage *rotatedImage = [testImage sd_rotatedImageWithAngle:angle fitSize:NO];
  87. // Not fit size and no change
  88. expect(CGSizeEqualToSize(rotatedImage.size, testImage.size)).beTruthy();
  89. // Fit size, may change size
  90. rotatedImage = [testImage sd_rotatedImageWithAngle:angle fitSize:YES];
  91. CGSize rotatedSize = CGSizeMake(ceil(300 * 1.414), ceil(300 * 1.414)); // 45º, square length * sqrt(2)
  92. expect(rotatedImage.size.width - rotatedSize.width <= 1).beTruthy();
  93. expect(rotatedImage.size.height - rotatedSize.height <= 1).beTruthy();
  94. // Check image not inversion
  95. UIColor *leftCenterColor = [rotatedImage sd_colorAtPoint:CGPointMake(60, 175)];
  96. expect([leftCenterColor.sd_hexString isEqualToString:[UIColor blackColor].sd_hexString]).beTruthy();
  97. }
  98. - (void)test05UIImageTransformFlipCG {
  99. [self test05UIImageTransformFlipWithImage:self.testImageCG];
  100. }
  101. - (void)test05UIImageTransformFlipCI {
  102. [self test05UIImageTransformFlipWithImage:self.testImageCI];
  103. }
  104. - (void)test05UIImageTransformFlipWithImage:(UIImage *)testImage {
  105. BOOL horizontal = YES;
  106. BOOL vertical = YES;
  107. UIImage *flippedImage = [testImage sd_flippedImageWithHorizontal:horizontal vertical:vertical];
  108. expect(CGSizeEqualToSize(flippedImage.size, testImage.size)).beTruthy();
  109. // Test pixel colors method here
  110. UIColor *checkColor = [flippedImage sd_colorAtPoint:CGPointMake(75, 75)];
  111. expect(checkColor);
  112. NSArray<UIColor *> *checkColors = [flippedImage sd_colorsWithRect:CGRectMake(75, 75, 10, 10)]; // Rect are all same color
  113. expect(checkColors.count).to.equal(10 * 10);
  114. for (UIColor *color in checkColors) {
  115. expect([color isEqual:checkColor]).to.beTruthy();
  116. }
  117. // Check image not inversion
  118. UIColor *bottomCenterColor = [flippedImage sd_colorAtPoint:CGPointMake(150, 285)];
  119. expect([bottomCenterColor.sd_hexString isEqualToString:[UIColor blackColor].sd_hexString]).beTruthy();
  120. }
  121. - (void)test06UIImageTransformTintCG {
  122. [self test06UIImageTransformTintWithImage:self.testImageCG];
  123. }
  124. - (void)test06UIImageTransformTintCI {
  125. [self test06UIImageTransformTintWithImage:self.testImageCI];
  126. }
  127. - (void)test06UIImageTransformTintWithImage:(UIImage *)testImage {
  128. UIColor *tintColor = [UIColor blackColor];
  129. UIImage *tintedImage = [testImage sd_tintedImageWithColor:tintColor];
  130. expect(CGSizeEqualToSize(tintedImage.size, testImage.size)).beTruthy();
  131. // Check center color, should keep clear
  132. UIColor *centerColor = [tintedImage sd_colorAtPoint:CGPointMake(150, 150)];
  133. expect([centerColor.sd_hexString isEqualToString:[UIColor clearColor].sd_hexString]);
  134. // Check left color, should be tinted
  135. UIColor *leftColor = [tintedImage sd_colorAtPoint:CGPointMake(80, 150)];
  136. expect([leftColor.sd_hexString isEqualToString:tintColor.sd_hexString]);
  137. // Check rounded corner operation not inversion the image
  138. UIColor *topCenterColor = [tintedImage sd_colorAtPoint:CGPointMake(150, 20)];
  139. expect([topCenterColor.sd_hexString isEqualToString:[UIColor blackColor].sd_hexString]).beTruthy();
  140. }
  141. - (void)test07UIImageTransformBlurCG {
  142. [self test07UIImageTransformBlurWithImage:self.testImageCG];
  143. }
  144. - (void)test07UIImageTransformBlurCI {
  145. [self test07UIImageTransformBlurWithImage:self.testImageCI];
  146. }
  147. - (void)test07UIImageTransformBlurWithImage:(UIImage *)testImage {
  148. CGFloat radius = 25;
  149. UIImage *blurredImage = [testImage sd_blurredImageWithRadius:radius];
  150. expect(CGSizeEqualToSize(blurredImage.size, testImage.size)).beTruthy();
  151. // Check left color, should be blurred
  152. UIColor *leftColor = [blurredImage sd_colorAtPoint:CGPointMake(80, 150)];
  153. // Hard-code from the output
  154. UIColor *expectedColor = [UIColor colorWithRed:0.431373 green:0.101961 blue:0.0901961 alpha:0.729412];
  155. expect([leftColor.sd_hexString isEqualToString:expectedColor.sd_hexString]);
  156. // Check rounded corner operation not inversion the image
  157. UIColor *topCenterColor = [blurredImage sd_colorAtPoint:CGPointMake(150, 20)];
  158. UIColor *bottomCenterColor = [blurredImage sd_colorAtPoint:CGPointMake(150, 280)];
  159. expect([topCenterColor.sd_hexString isEqualToString:bottomCenterColor.sd_hexString]).beFalsy();
  160. }
  161. - (void)test08UIImageTransformFilterCG {
  162. [self test08UIImageTransformFilterWithImage:self.testImageCG];
  163. }
  164. - (void)test08UIImageTransformFilterCI {
  165. [self test08UIImageTransformFilterWithImage:self.testImageCI];
  166. }
  167. - (void)test08UIImageTransformFilterWithImage:(UIImage *)testImage {
  168. // Invert color filter
  169. CIFilter *filter = [CIFilter filterWithName:@"CIColorInvert"];
  170. UIImage *filteredImage = [testImage sd_filteredImageWithFilter:filter];
  171. expect(CGSizeEqualToSize(filteredImage.size, testImage.size)).beTruthy();
  172. // Check left color, should be inverted
  173. UIColor *leftColor = [filteredImage sd_colorAtPoint:CGPointMake(80, 150)];
  174. // Hard-code from the output
  175. UIColor *expectedColor = [UIColor colorWithRed:0.85098 green:0.992157 blue:0.992157 alpha:1];
  176. expect([leftColor.sd_hexString isEqualToString:expectedColor.sd_hexString]);
  177. // Check rounded corner operation not inversion the image
  178. UIColor *topCenterColor = [filteredImage sd_colorAtPoint:CGPointMake(150, 20)];
  179. expect([topCenterColor.sd_hexString isEqualToString:[UIColor whiteColor].sd_hexString]).beTruthy();
  180. }
  181. #pragma mark - SDImageTransformer
  182. - (void)test09ImagePipelineTransformer {
  183. CGSize size = CGSizeMake(100, 100);
  184. SDImageScaleMode scaleMode = SDImageScaleModeAspectFill;
  185. CGFloat angle = M_PI_4;
  186. BOOL fitSize = NO;
  187. CGFloat radius = 50;
  188. #if SD_UIKIT
  189. SDRectCorner corners = UIRectCornerAllCorners;
  190. #else
  191. SDRectCorner corners = SDRectCornerAllCorners;
  192. #endif
  193. CGFloat borderWidth = 1;
  194. UIColor *borderCoder = [UIColor blackColor];
  195. BOOL horizontal = YES;
  196. BOOL vertical = YES;
  197. CGRect cropRect = CGRectMake(0, 0, 50, 50);
  198. UIColor *tintColor = [UIColor clearColor];
  199. CGFloat blurRadius = 5;
  200. SDImageResizingTransformer *transformer1 = [SDImageResizingTransformer transformerWithSize:size scaleMode:scaleMode];
  201. SDImageRotationTransformer *transformer2 = [SDImageRotationTransformer transformerWithAngle:angle fitSize:fitSize];
  202. SDImageRoundCornerTransformer *transformer3 = [SDImageRoundCornerTransformer transformerWithRadius:radius corners:corners borderWidth:borderWidth borderColor:borderCoder];
  203. SDImageFlippingTransformer *transformer4 = [SDImageFlippingTransformer transformerWithHorizontal:horizontal vertical:vertical];
  204. SDImageCroppingTransformer *transformer5 = [SDImageCroppingTransformer transformerWithRect:cropRect];
  205. SDImageTintTransformer *transformer6 = [SDImageTintTransformer transformerWithColor:tintColor];
  206. SDImageBlurTransformer *transformer7 = [SDImageBlurTransformer transformerWithRadius:blurRadius];
  207. CIFilter *filter = [CIFilter filterWithName:@"CIColorInvert"];
  208. SDImageFilterTransformer *transformer8 = [SDImageFilterTransformer transformerWithFilter:filter];
  209. // Chain all built-in transformers for test case
  210. SDImagePipelineTransformer *pipelineTransformer = [SDImagePipelineTransformer transformerWithTransformers:@[
  211. transformer1,
  212. transformer2,
  213. transformer3,
  214. transformer4,
  215. transformer5,
  216. transformer6,
  217. transformer7,
  218. transformer8
  219. ]];
  220. NSArray *transformerKeys = @[
  221. @"SDImageResizingTransformer({100.000000,100.000000},2)",
  222. @"SDImageRotationTransformer(0.785398,0)",
  223. @"SDImageRoundCornerTransformer(50.000000,18446744073709551615,1.000000,#ff000000)",
  224. @"SDImageFlippingTransformer(1,1)",
  225. @"SDImageCroppingTransformer({0.000000,0.000000,50.000000,50.000000})",
  226. @"SDImageTintTransformer(#00000000)",
  227. @"SDImageBlurTransformer(5.000000)",
  228. @"SDImageFilterTransformer(CIColorInvert)"
  229. ];
  230. NSString *transformerKey = [transformerKeys componentsJoinedByString:@"-"]; // SDImageTransformerKeySeparator
  231. expect([pipelineTransformer.transformerKey isEqualToString:transformerKey]).beTruthy();
  232. UIImage *transformedImage = [pipelineTransformer transformedImageWithImage:self.testImageCG forKey:@"Test"];
  233. expect(transformedImage).notTo.beNil();
  234. expect(CGSizeEqualToSize(transformedImage.size, cropRect.size)).beTruthy();
  235. }
  236. - (void)test10TransformerKeyForCacheKey {
  237. NSString *transformerKey = @"SDImageFlippingTransformer(1,0)";
  238. // File path representation test cases
  239. NSString *key = @"image.png";
  240. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"image-SDImageFlippingTransformer(1,0).png");
  241. key = @"image";
  242. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"image-SDImageFlippingTransformer(1,0)");
  243. key = @".image";
  244. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@".image-SDImageFlippingTransformer(1,0)");
  245. key = @"image.";
  246. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"image.-SDImageFlippingTransformer(1,0)");
  247. key = @"Test/image.png";
  248. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"Test/image-SDImageFlippingTransformer(1,0).png");
  249. // URL representation test cases
  250. key = @"http://foo/image.png";
  251. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"http://foo/image-SDImageFlippingTransformer(1,0).png");
  252. key = @"http://foo/image";
  253. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"http://foo/image-SDImageFlippingTransformer(1,0)");
  254. key = @"http://foo/.image";
  255. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"http://foo/.image-SDImageFlippingTransformer(1,0)");
  256. key = @"http://foo/image.png?foo=bar#mark";
  257. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"http://foo/image-SDImageFlippingTransformer(1,0).png?foo=bar#mark");
  258. key = @"ftp://root:password@foo.com/image.png";
  259. expect(SDTransformedKeyForKey(key, transformerKey)).equal(@"ftp://root:password@foo.com/image-SDImageFlippingTransformer(1,0).png");
  260. }
  261. #pragma mark - Coder Helper
  262. - (void)test20CGImageCreateDecodedWithOrientation {
  263. // Test EXIF orientation tag, you can open this image with `Preview.app`, open inspector (Command+I) and rotate (Command+L/R) to check
  264. UIImage *image = [[UIImage alloc] initWithContentsOfFile:[self testPNGPathForName:@"TestEXIF"]];
  265. CGImageRef originalCGImage = image.CGImage;
  266. expect(image).notTo.beNil();
  267. // Check the longest side of "F" point color
  268. UIColor *pointColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
  269. CGImageRef upCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationUp];
  270. #if SD_UIKIT
  271. UIImage *upImage = [[UIImage alloc] initWithCGImage:upCGImage];
  272. #else
  273. UIImage *upImage = [[UIImage alloc] initWithCGImage:upCGImage size:NSZeroSize];
  274. #endif
  275. expect([[upImage sd_colorAtPoint:CGPointMake(40, 160)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  276. expect(upImage.size).equal(CGSizeMake(150, 200));
  277. CGImageRelease(upCGImage);
  278. CGImageRef upMirroredCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationUpMirrored];
  279. #if SD_UIKIT
  280. UIImage *upMirroredImage = [[UIImage alloc] initWithCGImage:upMirroredCGImage];
  281. #else
  282. UIImage *upMirroredImage = [[UIImage alloc] initWithCGImage:upMirroredCGImage size:NSZeroSize];
  283. #endif
  284. expect([[upMirroredImage sd_colorAtPoint:CGPointMake(110, 160)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  285. expect(upMirroredImage.size).equal(CGSizeMake(150, 200));
  286. CGImageRelease(upMirroredCGImage);
  287. CGImageRef downCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationDown];
  288. #if SD_UIKIT
  289. UIImage *downImage = [[UIImage alloc] initWithCGImage:downCGImage];
  290. #else
  291. UIImage *downImage = [[UIImage alloc] initWithCGImage:downCGImage size:NSZeroSize];
  292. #endif
  293. expect([[downImage sd_colorAtPoint:CGPointMake(110, 30)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  294. expect(downImage.size).equal(CGSizeMake(150, 200));
  295. CGImageRelease(downCGImage);
  296. CGImageRef downMirrorerdCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationDownMirrored];
  297. #if SD_UIKIT
  298. UIImage *downMirroredImage = [[UIImage alloc] initWithCGImage:downMirrorerdCGImage];
  299. #else
  300. UIImage *downMirroredImage = [[UIImage alloc] initWithCGImage:downMirrorerdCGImage size:NSZeroSize];
  301. #endif
  302. expect([[downMirroredImage sd_colorAtPoint:CGPointMake(40, 30)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  303. expect(downMirroredImage.size).equal(CGSizeMake(150, 200));
  304. CGImageRelease(downMirrorerdCGImage);
  305. CGImageRef leftMirroredCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationLeftMirrored];
  306. #if SD_UIKIT
  307. UIImage *leftMirroredImage = [[UIImage alloc] initWithCGImage:leftMirroredCGImage];
  308. #else
  309. UIImage *leftMirroredImage = [[UIImage alloc] initWithCGImage:leftMirroredCGImage size:NSZeroSize];
  310. #endif
  311. expect([[leftMirroredImage sd_colorAtPoint:CGPointMake(160, 40)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  312. expect(leftMirroredImage.size).equal(CGSizeMake(200, 150));
  313. CGImageRelease(leftMirroredCGImage);
  314. CGImageRef rightCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationRight];
  315. #if SD_UIKIT
  316. UIImage *rightImage = [[UIImage alloc] initWithCGImage:rightCGImage];
  317. #else
  318. UIImage *rightImage = [[UIImage alloc] initWithCGImage:rightCGImage size:NSZeroSize];
  319. #endif
  320. expect([[rightImage sd_colorAtPoint:CGPointMake(30, 40)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  321. expect(rightImage.size).equal(CGSizeMake(200, 150));
  322. CGImageRelease(rightCGImage);
  323. CGImageRef rightMirroredCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationRightMirrored];
  324. #if SD_UIKIT
  325. UIImage *rightMirroredImage = [[UIImage alloc] initWithCGImage:rightMirroredCGImage];
  326. #else
  327. UIImage *rightMirroredImage = [[UIImage alloc] initWithCGImage:rightMirroredCGImage size:NSZeroSize];
  328. #endif
  329. expect([[rightMirroredImage sd_colorAtPoint:CGPointMake(30, 110)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  330. expect(rightMirroredImage.size).equal(CGSizeMake(200, 150));
  331. CGImageRelease(rightMirroredCGImage);
  332. CGImageRef leftCGImage = [SDImageCoderHelper CGImageCreateDecoded:originalCGImage orientation:kCGImagePropertyOrientationLeft];
  333. #if SD_UIKIT
  334. UIImage *leftImage = [[UIImage alloc] initWithCGImage:leftCGImage];
  335. #else
  336. UIImage *leftImage = [[UIImage alloc] initWithCGImage:leftCGImage size:NSZeroSize];
  337. #endif
  338. expect([[leftImage sd_colorAtPoint:CGPointMake(160, 110)].sd_hexString isEqualToString:pointColor.sd_hexString]).beTruthy();
  339. expect(leftImage.size).equal(CGSizeMake(200, 150));
  340. CGImageRelease(leftCGImage);
  341. }
  342. #pragma mark - Helper
  343. - (UIImage *)testImageCG {
  344. if (!_testImageCG) {
  345. _testImageCG = [[UIImage alloc] initWithContentsOfFile:[self testPNGPathForName:@"TestImage"]];
  346. }
  347. return _testImageCG;
  348. }
  349. - (UIImage *)testImageCI {
  350. if (!_testImageCI) {
  351. CIImage *ciImage = [[CIImage alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[self testPNGPathForName:@"TestImage"]]];
  352. #if SD_UIKIT
  353. _testImageCI = [[UIImage alloc] initWithCIImage:ciImage scale:1 orientation:UIImageOrientationUp];
  354. #else
  355. _testImageCI = [[UIImage alloc] initWithCIImage:ciImage scale:1 orientation:kCGImagePropertyOrientationUp];
  356. #endif
  357. }
  358. return _testImageCI;
  359. }
  360. - (NSString *)testPNGPathForName:(NSString *)name {
  361. NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
  362. return [testBundle pathForResource:name ofType:@"png"];
  363. }
  364. @end