Java getRGB()
trả về một số nguyên thể hiện màu trong không gian màu sRGB mặc định (bit 24-31 là alpha, 16-23 là màu đỏ, 8-15 có màu xanh lá cây, 0-7 là màu xanh dương).
UIColor
không có một phương pháp như vậy, nhưng bạn có thể định nghĩa của riêng bạn:
extension UIColor {
func rgb() -> Int? {
var fRed : CGFloat = 0
var fGreen : CGFloat = 0
var fBlue : CGFloat = 0
var fAlpha: CGFloat = 0
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
let iRed = Int(fRed * 255.0)
let iGreen = Int(fGreen * 255.0)
let iBlue = Int(fBlue * 255.0)
let iAlpha = Int(fAlpha * 255.0)
// (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue).
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return rgb
} else {
// Could not extract RGBA components:
return nil
}
}
}
Cách sử dụng:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
if let rgb = swiftColor.rgb() {
print(rgb)
} else {
print("conversion failed")
}
Lưu ý rằng điều này sẽ chỉ làm việc nếu UIColor
đã được định nghĩa trong một Không gian màu "tương thích RGB" (chẳng hạn như RGB, HSB hoặc GrayScale). Nó có thể không thành công nếu màu đã được tạo từ một hình ảnh CIColor
hoặc hình ảnh , trong trường hợp đó, nil
được trả về.
Ghi chú: Như @ vonox7 nhận thấy, giá trị trả về có thể là tiêu cực trên nền tảng 32-bit (mà cũng là trường hợp với các phương pháp Java getRGB()
). Nếu không muốn, thay thế Int
bằng UInt
hoặc Int64
.
Nguồn
2015-02-21 11:46:15
Cảm ơn rất nhiều. Đó là những gì tôi đã tìm kiếm. Bạn có thể có cùng một trở lại?(Tôi rất mới nhanh) -> getRed (iRGBValue: Int) -> Int? –
@ user1344545: Tôi không chắc chắn nếu tôi hiểu câu hỏi của bạn một cách chính xác. Bạn có thể trích xuất các thành phần từ giá trị rgb bằng thao tác shift + mask đơn giản, ví dụ 'let red = (rgb >> 16) & 0xFF'. Nhưng nếu bạn muốn các giá trị một cách riêng biệt, sau đó nó sẽ được dễ dàng hơn để chỉ tính iRed, iGreen, iBlue, iAlpha như trong phương pháp trên và không kết hợp chúng với một số duy nhất. –
Bạn đã hiểu chính xác. let red = (rgb >> 16) & 0xFF là những gì tôi tìm kiếm. Cảm ơn bạn rất nhiều ! –