Rails mini_magick 如何裁剪数据库里面的图片

minix · 2012年05月14日 · 最后由 minix 回复于 2012年05月17日 · 5325 次阅读

各位好!

如果在不使用任何插件,直接使用 mini_magick 裁剪数据库里面的图片? 我抄的上传图片的 MVC,不过就不知道怎么去裁剪: controller

class PhotoController < ApplicationController
     def get
       @photo = Photo.new
     end
     def save
       @photo = Photo.new(params[:photo])
      if @photo.save
        redirect_to(action: 'show', id: @photo.id)
      else
        render(action: get)
      end
    end
    def photo
      @photo = Photo.find(params[:id])
      img = MiniMagick::Image.open("#{@photo.data}")
      img.resize!("200", "200")
      send_data(img.to_blob,
                filename: @photo.name,
                type: @photo.content_type,
               disposition: "inline")
    end
    def show
      @photo = Photo.find(params[:id])
    end
  end

model

class Photo < ActiveRecord::Base
        def uploaded_photo=(photo_field)  
                self.name = base_part_of(photo_field.original_filename)
                self.content_type = photo_field.content_type.chomp
                self.data = photo_field.read
        end
        def base_part_of(file_name)
                File.basename(file_name).gsub(/[^\w._-]/, '')
        end
end

views

get.html.erb
<%= form_for(:photo, url: {action: 'save'}, html: {multipart: true}) do |form| %>
        comment:        <%= form.text_field :comment %><br />
        upload:   <%= form.file_field "uploaded_photo" %>
        <%= submit_tag("Upload File") %>
<% end %>
show.html.erb
<h3><%= @photo.comment %></h3>
<img src="<%= url_for(:action => 'photo', :id => @photo.id) %>" />

我还有一个想法是将图片转为 base64, 然后网页上直接使用 base64 访问图片. 不过这些方法我都无法使用 mini_magick 来裁剪! 是不是图片再从数据库里面拿出来时,已经是字符串了,无法使用 mini_magick 来裁剪。如果是的话要怎么才能裁剪?

image = MiniMagick::Image.read(blob)
image.resize "100x100"
image.write  "output.jpg"

https://github.com/probablycorey/mini_magick

话说你把图片放到数据库里?

@chinacheng 是的,将图片放到数据库里面。 想将图片裁剪然后转为 base64 存到数据库里。这样引用图片的时候直接拿 base64 码出来即可。 您的方法我试过,不过行不通。

#3 楼 @minix 行不通可能是你的代码有问题。把图片放到数据库里,你的数据库得多大? 你要非这么做,你可以把他写生文件,切好了再存到数据库里。我觉得你还是想想你把它存在数据库里这个问题合适不合适吧!

处理图片时候写入临时文件然后处理。不然处理图片过程和图片本身都要占据很大内存,不利于 scale

感谢各位的建议。经过几天的不断抄袭,终于找出裁剪图片的方法:主要是在 model 里面进行: model

require 'base64'
require 'mini_magick'
#include Magick
include MiniMagick
class Photo < ActiveRecord::Base
        validates_format_of :content_type,
                with: /^image/,
                message: "--- Must upload photo"

        def uploaded_photo=(photo_field)
                self.name = base_part_of(photo_field.original_filename)
                self.content_type = photo_field.content_type.chomp
                img = MiniMagick::Image.read(photo_field.read)
                img_original = img
                self.original = img_original.to_blob
                img_large = img
                img_large.resize("240x360")
                self.large = img_large.to_blob
                img_thumbnail = img
                img_thumbnail.resize("120x180")
                self.thumbnail = img_thumbnail.to_blob
        end

        def base_part_of(file_name)
                File.basename(file_name).gsub(/[^\w._-]/, '')
        end
end

这样就裁剪成了三个不同大小的图片:分别是 原图,240x360, 120x180 三张图。

又得请教大家另一问题:怎么才可以平均的裁剪图片,才能尽可能地保持原图的质量?不用被拉伸,压扁。。。 谢谢!

裁剪根本就不会拉伸!压扁!

4 格缩进好难看!

你去 iamgemagick 文档上面把 resize crop 等命令看明白了以后图片处理 60% 的问题都解决了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号