2012-12-19 18 views
8

Làm thế nào tôi có thể thay đổi màu sắc từ này:Sửa màu sắc của hình ảnh trong ruby ​​

vào đây:

tôi tạo ra hình ảnh đầu ra sử dụng Gimp với hình ảnh đầu vào dưới dạng lớp một và màu nền từ hình ảnh dưới dạng lớp hai, trong bảng điều khiển Lớp, tôi đã chọn chế độ "màu"

Tôi muốn giữ màu nền, nhưng muốn màu sắc có màu nâu.

Bất kỳ ý tưởng nào để làm điều này với ChunkyPNG? Hoặc tôi nên sử dụng ImageMagick với bảng tra cứu màu?

+0

liên quan: http://stackoverflow.com/questions/11973086/duplicate-photoshops-color-blend-mode-in-imagemagick –

+0

Vâng, đầu tiên tìm ra những loại điểm ảnh toán học GIMP đang làm cho chế độ "màu", sau đó thực hiện phép toán pixel đó bằng cách sử dụng một trong các thư viện hình ảnh. – Linuxios

+1

Nếu tôi là bạn đầu tiên tôi sẽ desaturate hình ảnh và sau đó quy mô mỗi điểm ảnh từ màu xám sang màu nâu "tương ứng" của nó thông qua một số chức năng mở rộng quy mô. – maerics

Trả lời

2

Cảm ơn ý tưởng của bạn.

Tôi tìm thấy một từ Linuxios hữu ích nhất Gimp layer modes

require "json" 
require "httpclient" 
require "chunky_png" 

module ChunkyPNG::Color 

    def h(value) 
    r,g,b = r(value).to_f/MAX, g(value).to_f/MAX, b(value).to_f/MAX 
    min, max = [r,g,b].minmax 

    return 0 if max == min 

    result = case max 
     when r then (g - b)/(max - min) + (g < b ? 6 : 0) 
     when g then (b - r)/(max - min) + 2 
     when b then (r - g)/(max - min) + 4 
    end 

    result * 60 
    end 

    def s(value) 
    min, max = [r(value), g(value), b(value)].minmax.map { |value| value.to_f/MAX } 
    max == 0 ? 0 : (max - min)/max 
    end 

    def v(value) 
    [r(value), g(value), b(value)].max.to_f/MAX 
    end 

    def hsv(h, s, v) 
    h = h.to_f/360 
    i = (h * 6).floor 
    f = h * 6 - i 
    p = v * (1 - s) 
    q = v * (1 - f * s) 
    t = v * (1 - (1 - f) * s) 

    case i % 6 
     when 0 then r, g, b = v, t, p 
     when 1 then r, g, b = q, v, p 
     when 2 then r, g, b = p, v, t 
     when 3 then r, g, b = p, q, v 
     when 4 then r, g, b = t, p, v 
     when 5 then r, g, b = v, p, q 
    end 

    rgb *[r,g,b].map {|value| (value * 255).round } 
    end 

end 


module CoderWall 

    module_function 

    def badges(username) 
    url = URI.escape("https://coderwall.com/#{username}.json") 
    response = HTTPClient.get(url) 

    json = JSON.parse(response.body) 
    urls = json['badges'].map {|b| b['badge']} 
    brown  = ChunkyPNG::Color.from_hex("#bf8a30") 
    hue  = ChunkyPNG::Color.h(brown) 
    saturation = ChunkyPNG::Color.s(brown) 
    value  = ChunkyPNG::Color.v(brown) 
    urls.each do |url| 
     matches = url.match /(\w+)\-/ 
     response = HTTPClient.get(url) 
     filename = "./tmp/coderwall/"+matches[1]+".png" 
     File.open(filename,"w") {|f| f.write(response.body)} 

     image = ChunkyPNG::Image.from_file(filename) 

     image.pixels.map! do |pixel| 
      v = ChunkyPNG::Color.v(pixel) 
      unless ChunkyPNG::Color.a(pixel) > 0 
      v = value 
      end 
      ChunkyPNG::Color.hsv(hue,saturation, v) 
     end 
     image.save(filename.gsub(/\.png/,"_brown.png"), :fast_rgba) 
    end 
    end 
end 

badges = CoderWall.badges("astropanic") 

Đó mã trên bao gồm từ một số đoạn tìm thấy khắp nơi trên web.

Dưới đây là kết quả: Stop doing new year resolutions. Make the change now !