代码之家  ›  专栏  ›  技术社区  ›  Dogbert

Ruby中的图像处理

  •  1
  • Dogbert  · 技术社区  · 15 年前

    我正在寻找一种方法来加载现有的png图像,并对值进行逐像素的操作。理想的情况是

    image = Image.open('my.png')
    image = image.map_each_rgb do |r, g, b|
      [r-12, g+2, b+30]
    end
    image.save('my.png')
    

    rmagick

    有没有其他方法可以允许这样的图像编辑?

    3 回复  |  直到 15 年前
        1
  •  3
  •   jrdioko    15 年前

    RMagick的怎么样 each_pixel 方法?

    http://studio.imagemagick.org/RMagick/doc/image2.html#each_pixel

    img.each_pixel {|pixel, c, r| block }
    
        2
  •  2
  •   jcupitt    10 年前

    以下是如何在ruby VIP中实现所需的功能:

    require 'vips'
    include VIPS
    
    im = Image.new('/home/john/pics/shark.png')
    
    # y = x.lin(a, b) calculates (y = x * a + b), ie. a linear transform
    # you can pass a single constant for a and b, or an array of constants, in
    # which case one element of the array is used for each channel
    
    # see http://rubydoc.info/gems/ruby-vips/0.3.0/VIPS/Image#lin-instance_method
    
    # subtract 12 from red, add 2 to green, add 30 to blue
    im = im.lin [1, 1, 1], [-12, 2, 30]
    
    im.write('out.png')
    

    它比rmagick快得多,占用的内存少得多,而且没有(据我所知)泄漏。请参见:

    http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use

        3
  •  0
  •   Carma Tec    9 年前

    在gem文件中添加gem-rmagick for ruby或rmagick4j for jruby。 图像裁剪: 使用回形针和jcrop实现 我们可以使用id/class直接调用jcrop。然后我们可以得到新的高度和宽度。

    $(function(){$(#cropbox).Jcrop({onChange:update\u crop,onSelect: update_crop,setSelect:[0,0,500,500],aspectRatio:1});});

    函数更新_crop(coords){$(#crop_x).val(coords.x); $(#crop_y).val(coords.y);$(#crop_w).val(coords.w);

    http://www.railscarma.com/blog/technical-articles/image-manipulation/

    推荐文章