Việc này mất khá nhiều thời gian, chủ yếu là vì tôi muốn thiết lập và chạy nó trong Swift bằng cách sử dụng Core Image và CIColorCube.
@ Giải thích của Miguel là tại chỗ về cách bạn cần thay thế một "phạm vi góc Huế" với "phạm vi góc Hue" khác. Bạn có thể đọc bài viết của mình ở trên để biết chi tiết về phạm vi của Hue Angle.
Tôi đã tạo một ứng dụng nhanh chóng thay thế một chiếc xe tải màu xanh mặc định bên dưới, với bất cứ thứ gì bạn chọn trên thanh trượt Hue.
Bạn có thể trượt thanh trượt để nói với ứng dụng những gì Huế màu sắc mà bạn muốn thay thế màu xanh với.
Tôi đang mã hóa cứng phạm vi Huế thành 60 độ, thường có vẻ bao gồm hầu hết một màu cụ thể nhưng bạn có thể chỉnh sửa nếu cần.
Chú ý rằng nó không màu lốp xe hoặc đèn đuôi vì đó là ngoài phạm vi 60 độ của màu xanh mặc định của xe tải, nhưng nó không xử lý che một cách thích hợp.
Trước tiên, bạn cần có mã để chuyển đổi RGB để HSV (giá trị Huế):
func RGBtoHSV(r : Float, g : Float, b : Float) -> (h : Float, s : Float, v : Float) {
var h : CGFloat = 0
var s : CGFloat = 0
var v : CGFloat = 0
let col = UIColor(red: CGFloat(r), green: CGFloat(g), blue: CGFloat(b), alpha: 1.0)
col.getHue(&h, saturation: &s, brightness: &v, alpha: nil)
return (Float(h), Float(s), Float(v))
}
Sau đó, bạn cần phải chuyển đổi HSV để RGB. Bạn muốn sử dụng điều này khi bạn phát hiện ra một màu sắc trong phạm vi màu mong muốn của bạn (aka, một màu sắc đó là cùng một màu xanh của xe tải mặc định) để tiết kiệm bất kỳ điều chỉnh bạn thực hiện.
func HSVtoRGB(h : Float, s : Float, v : Float) -> (r : Float, g : Float, b : Float) {
var r : Float = 0
var g : Float = 0
var b : Float = 0
let C = s * v
let HS = h * 6.0
let X = C * (1.0 - fabsf(fmodf(HS, 2.0) - 1.0))
if (HS >= 0 && HS < 1) {
r = C
g = X
b = 0
} else if (HS >= 1 && HS < 2) {
r = X
g = C
b = 0
} else if (HS >= 2 && HS < 3) {
r = 0
g = C
b = X
} else if (HS >= 3 && HS < 4) {
r = 0
g = X
b = C
} else if (HS >= 4 && HS < 5) {
r = X
g = 0
b = C
} else if (HS >= 5 && HS < 6) {
r = C
g = 0
b = X
}
let m = v - C
r += m
g += m
b += m
return (r, g, b)
}
Bây giờ bạn chỉ cần lặp qua một khối màu RGBA đầy đủ và "điều chỉnh" bất kỳ màu nào trong dải màu "mặc định xanh" với màu từ màu mới bạn muốn. Sau đó, sử dụng Core Image và bộ lọc CIColorCube để áp dụng khối màu đã điều chỉnh của bạn cho hình ảnh.
func render() {
let centerHueAngle: Float = 214.0/360.0 //default color of truck body blue
let destCenterHueAngle: Float = slider.value
let minHueAngle: Float = (214.0 - 60.0/2.0)/360 //60 degree range = +30 -30
let maxHueAngle: Float = (214.0 + 60.0/2.0)/360
var hueAdjustment = centerHueAngle - destCenterHueAngle
let size = 64
var cubeData = [Float](count: size * size * size * 4, repeatedValue: 0)
var rgb: [Float] = [0, 0, 0]
var hsv: (h : Float, s : Float, v : Float)
var newRGB: (r : Float, g : Float, b : Float)
var offset = 0
for var z = 0; z < size; z++ {
rgb[2] = Float(z)/Float(size) // blue value
for var y = 0; y < size; y++ {
rgb[1] = Float(y)/Float(size) // green value
for var x = 0; x < size; x++ {
rgb[0] = Float(x)/Float(size) // red value
hsv = RGBtoHSV(rgb[0], g: rgb[1], b: rgb[2])
if hsv.h < minHueAngle || hsv.h > maxHueAngle {
newRGB.r = rgb[0]
newRGB.g = rgb[1]
newRGB.b = rgb[2]
} else {
hsv.h = destCenterHueAngle == 1 ? 0 : hsv.h - hueAdjustment //force red if slider angle is 360
newRGB = HSVtoRGB(hsv.h, s:hsv.s, v:hsv.v)
}
cubeData[offset] = newRGB.r
cubeData[offset+1] = newRGB.g
cubeData[offset+2] = newRGB.b
cubeData[offset+3] = 1.0
offset += 4
}
}
}
let data = NSData(bytes: cubeData, length: cubeData.count * sizeof(Float))
let colorCube = CIFilter(name: "CIColorCube")!
colorCube.setValue(size, forKey: "inputCubeDimension")
colorCube.setValue(data, forKey: "inputCubeData")
colorCube.setValue(ciImage, forKey: kCIInputImageKey)
if let outImage = colorCube.outputImage {
let context = CIContext(options: nil)
let outputImageRef = context.createCGImage(outImage, fromRect: outImage.extent)
imageView.image = UIImage(CGImage: outputImageRef)
}
}
Bạn có thể tải xuống sample project here. Nó đang sử dụng Xcode 7 và Swift 2.0.
câu hỏi hay, nếu bạn có câu trả lời hoàn hảo, tôi sẽ sử dụng số –
Tôi cũng gặp vấn đề tương tự, tôi đã đăng câu hỏi [vấn đề colorfill] (http://stackoverflow.com/questions/8124308/filling -a-phần-of-an-hình ảnh-với-màu), – Marios
hi bạn đã có bất kỳ ý tưởng trong này – Marios