2010-05-29 7 views
9

Tôi đã lấy một cái nhìn tại câu hỏi này: UIImage Shadow TroubleTạo UIImage mới bằng cách thêm bóng tối để UIImage hiện

Nhưng câu trả lời chấp nhận không làm việc cho tôi.

Điều tôi đang cố gắng thực hiện là thực hiện UIImage và thêm bóng cho nó, sau đó trả về một UIImage hoàn toàn mới, bóng đổ và tất cả.

Đây là những gì tôi đang cố gắng:

- (UIImage*)imageWithShadow { 

    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef shadowContext = CGBitmapContextCreate(NULL, self.size.width, self.size.height + 1, CGImageGetBitsPerComponent(self.CGImage), 0, 
               colourSpace, kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colourSpace); 

    CGContextSetShadow(shadowContext, CGSizeMake(0, -1), 1); 
    CGContextDrawImage(shadowContext, CGRectMake(0, 0, self.size.width, self.size.height), self.CGImage); 

    CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext); 
    CGContextRelease(shadowContext); 

    UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage]; 
    CGImageRelease(shadowedCGImage); 

    return shadowedImage; 
} 

Kết quả là tôi nhận được chính xác hình ảnh tương tự như trước khi tôi đặt nó thông qua phương pháp này.

Tôi đang làm điều này một cách chính xác, hoặc có điều gì đó rõ ràng tôi đang thiếu?

Trả lời

14

Có một số vấn đề với mã của bạn:

  • ảnh Mục tiêu là quá nhỏ. Hãy chắc chắn có đủ chỗ để vẽ bóng.
  • Cân nhắc sử dụng CGContextSetShadowWithColor để xác định cả bóng và màu của bóng.
  • Đừng quên rằng hệ tọa độ được lật, do đó, nguồn gốc là dưới cùng bên trái, không phải trên cùng bên trái.

Bằng cách khắc phục những vấn đề này, bóng sẽ được vẽ.

- (UIImage*)imageWithShadow { 
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef shadowContext = CGBitmapContextCreate(NULL, self.size.width + 10, self.size.height + 10, CGImageGetBitsPerComponent(self.CGImage), 0, 
              colourSpace, kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colourSpace); 

    CGContextSetShadowWithColor(shadowContext, CGSizeMake(5, -5), 5, [UIColor blackColor].CGColor); 
    CGContextDrawImage(shadowContext, CGRectMake(0, 10, self.size.width, self.size.height), self.CGImage); 

    CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext); 
    CGContextRelease(shadowContext); 

    UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage]; 
    CGImageRelease(shadowedCGImage); 

    return shadowedImage; 
} 
+0

Hoàn hảo! Tôi đã thực sự thêm 1 đến chiều cao để vẽ bóng, nhưng những thứ khác (thiết lập bóng, lật hệ tọa độ) đã được phát hiện. –

+0

Mã này sẽ được triển khai ở đâu và bạn sẽ gọi nó như thế nào để thêm bóng vào hình ảnh? –

+0

Phương pháp giả định rằng lớp có thể cung cấp một CGImage và kích thước của nó. Bạn có thể thay đổi phương thức để lấy tham số (CGImage và CGSize) thay thế. –

5

Tôi cần phương thức chấp nhận UIImage làm tham số và trả lại UIImage lớn hơn một chút với bóng. Các bài viết ở đây đã rất hữu ích cho tôi vì vậy đây là phương pháp của tôi. Hình ảnh trả lại có một bóng 5px ở giữa mỗi bên.

+(UIImage*)imageWithShadowForImage:(UIImage *)initialImage { 

CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef shadowContext = CGBitmapContextCreate(NULL, initialImage.size.width + 10, initialImage.size.height + 10, CGImageGetBitsPerComponent(initialImage.CGImage), 0, colourSpace, kCGImageAlphaPremultipliedLast); 
CGColorSpaceRelease(colourSpace); 

CGContextSetShadowWithColor(shadowContext, CGSizeMake(0,0), 5, [UIColor blackColor].CGColor); 
CGContextDrawImage(shadowContext, CGRectMake(5, 5, initialImage.size.width, initialImage.size.height), initialImage.CGImage); 

CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext); 
CGContextRelease(shadowContext); 

UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage]; 
CGImageRelease(shadowedCGImage); 

return shadowedImage; 
} 
3

Tôi cần một bóng lớn hơn cho UIImages của mình. Đây là biến thể của tôi về câu trả lời cho phép kích thước bóng tùy chỉnh mà không có bù đắp.

- (UIImage*)imageWithShadow:(UIImage*)originalImage BlurSize:(float)blurSize { 

    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef shadowContext = CGBitmapContextCreate(NULL, originalImage.size.width + (blurSize*2), originalImage.size.height + (blurSize*2), CGImageGetBitsPerComponent(originalImage.CGImage), 0, colourSpace, kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colourSpace); 

    CGContextSetShadowWithColor(shadowContext, CGSizeMake(0, 0), blurSize, [UIColor blackColor].CGColor); 
    CGContextDrawImage(shadowContext, CGRectMake(blurSize, blurSize, originalImage.size.width, originalImage.size.height), originalImage.CGImage); 

    CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext); 
    CGContextRelease(shadowContext); 

    UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage]; 
    CGImageRelease(shadowedCGImage); 

    return shadowedImage; 
} 

sử dụng nó như:

UIImage *shadowedImage = [self imageWithShadow:myImage BlurSize:30.0f]; 
0

Để thực hiện một hình ảnh một CGImage như trong trường hợp này, hãy thử

self.shadowImage.CGImage 
4

iOS8/Swift phiên bản (thực hiện như một phần mở rộng để UIImage):

extension UIImage { 

    func addShadow(blurSize: CGFloat = 6.0) -> UIImage { 

     let shadowColor = UIColor(white:0.0, alpha:0.8).cgColor 

     let context = CGContext(data: nil, 
           width: Int(self.size.width + blurSize), 
           height: Int(self.size.height + blurSize), 
           bitsPerComponent: self.cgImage!.bitsPerComponent, 
           bytesPerRow: 0, 
           space: CGColorSpaceCreateDeviceRGB(), 
           bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)! 

     context.setShadow(offset: CGSize(width: blurSize/2,height: -blurSize/2), 
          blur: blurSize, 
          color: shadowColor) 
     context.draw(self.cgImage!, 
        in: CGRect(x: 0, y: blurSize, width: self.size.width, height: self.size.height), 
        byTiling:false) 

     return UIImage(cgImage: context.makeImage()!) 
    } 
} 

(con verted từ & capikaw câu trả lời Laurent Etiemble của)

EDIT 2016/10/31: chuyển đổi sang Swift 3, và loại bỏ tất cả những thứ không cần thiết

Cách sử dụng:

let sourceImage: UIImage(named: "some image") 
let shadowImage = sourceImage.addShadow() 
+0

Vui lòng cập nhật nó cho Swift 2.0 – itsji10dra

+0

câu trả lời thú vị +1 cho bạn – Vats

0

câu trả lời GK100 trong Swift 2/iOS9

func addShadow(blurSize: CGFloat = 6.0) -> UIImage { 

    let data : UnsafeMutablePointer<Void> = nil 
    let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB()! 
    let bitmapInfo : CGBitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue) 

    let myColorValues:[CGFloat] = [0.0, 0.0, 0.0, 0.8] 
    let myColor = CGColorCreate(colorSpace, myColorValues) 

    let shadowContext : CGContextRef = CGBitmapContextCreate(data, Int(self.size.width + blurSize), Int(self.size.height + blurSize), CGImageGetBitsPerComponent(self.CGImage), 0, colorSpace, bitmapInfo.rawValue)! 

    CGContextSetShadowWithColor(shadowContext, CGSize(width: blurSize/2,height: -blurSize/2), blurSize, myColor) 
    CGContextDrawImage(shadowContext, CGRect(x: 0, y: blurSize, width: self.size.width, height: self.size.height), self.CGImage) 

    let shadowedCGImage : CGImageRef = CGBitmapContextCreateImage(shadowContext)! 
    let shadowedImage : UIImage = UIImage(CGImage: shadowedCGImage) 

    return shadowedImage 
} 
1

Phương pháp của tôi vẽ bóng trên hình ảnh. Nó có thông số bóng tùy chỉnh và hiển thị hình ảnh ở kích thước và tỷ lệ màn hình chính xác. Nên được triển khai trong phần mở rộng UIImage. (Swift 3).

func addingShadow(blur: CGFloat = 1, shadowColor: UIColor = UIColor(white: 0, alpha: 1), offset: CGSize = CGSize(width: 1, height: 1)) -> UIImage { 

    UIGraphicsBeginImageContextWithOptions(CGSize(width: size.width + 2 * blur, height: size.height + 2 * blur), false, 0) 
    let context = UIGraphicsGetCurrentContext()! 

    context.setShadow(offset: offset, blur: blur, color: shadowColor.cgColor) 
    draw(in: CGRect(x: blur - offset.width/2, y: blur - offset.height/2, width: size.width, height: size.height)) 
    let image = UIGraphicsGetImageFromCurrentImageContext()! 

    UIGraphicsEndImageContext() 

    return image 
}