2012-12-19 23 views
8

Come posso cambiare i colori da questo:Modifica dei colori delle immagini in rubino

in questo:

ho generato l'immagine in uscita utilizzando Gimp l'immagine in ingresso con come livello uno, e il colore di sfondo dall'immagine come livello due, nel pannello Livelli ho selezionato la modalità "colori"

Voglio mantenere il colore di sfondo, ma voglio che i colori siano sfumature di marrone.

Qualche idea per farlo con ChunkyPNG? O dovrei usare ImageMagick con tabelle di ricerca del colore?

+0

correlati: http://stackoverflow.com/questions/11973086/duplicate-photoshops-color-blend-mode-in-imagemagick –

+0

Beh, in primo luogo scoprire che tipo di pixel la matematica che GIMP sta facendo per la modalità "colore", quindi usa quel tipo di matematica dei pixel usando una delle librerie di immagini. – Linuxios

+1

Se fossi in te vorrei prima desaturare l'immagine e quindi ridimensionare ogni pixel dal grigio al suo colore marrone "corrispondente" tramite una funzione di ridimensionamento. – maerics

risposta

2

Grazie per le vostre idee.

ho trovato quello da Linuxios più utile 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") 

Questo codice di cui sopra è composto da alcuni frammenti trovati in tutto il web.

Ecco il risultato: Stop doing new year resolutions. Make the change now !

Problemi correlati