2010-03-14 5 views
12

Ich erstelle eine kleine Foto-Sharing-Site für das Intranet unseres Heims, und ich habe eine Upload-Funktion, die das Foto in Originalgröße in die Datenbank hochlädt. Allerdings möchte ich das Foto auch in vier anderen Größen speichern: W = 1024, W = 512, W = 256 und W = 128, aber nur die Größen kleiner als die Originalgröße (zB wenn die Originalbreite 511 ist, erzeuge nur 256 und 128). Das Bild mit einer Breite von 128 sollte immer erzeugt werden (weil es ein Thumbnail ist). Außerdem sollte die Größenänderung immer mit einer proportionalen Breite und Höhe erfolgen. Wie kann ich das umsetzen? Ich habe bereits diesen Code, um das Foto zu laden:Grundlegende Bildgrößenanpassung in Ruby on Rails

pic.rb < - Modell

def image_file=(input_data) 
    self.filename  = input_data.original_filename 
    self.content_type = input_data.content_type.chomp 
    self.binary_data = input_data.read 
    # here it should generate the smaller sizes 
    #+and save them to self.binary_data_1024, etc... 
end 

new.rb < - Ansicht

<h1>New pic</h1> 

<% form_for(@pic, :html => {:multipart => true}) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </p> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </p> 
    <p> 
    <%= f.label :image_file %><br /> 
    <%= f.file_field :image_file %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

<%= link_to 'Back', pics_path %> 

Dank

Antwort

25

Sie können die Größe mit RMagick gem.

Dies ist nur ein Beispiel dafür, dass Sie anpassen können:

require 'RMagick' 

f = File.new(File.join(save_path, self.filename), "wb" ) 
f.write form_file.read #remeber to set :html=>{:multipart => true} in form 
f.close 

image = Magick::Image.read(self.filename).first 
image.change_geometry!("640x480") { |cols, rows, img| 
    newimg = img.resize(cols, rows) 
    newimg.write("newfilename.jpg") 
} 

Mehr Infos hier: http://www.imagemagick.org/script/api.php#ruby

3

Ich versuchte folgenden Weg. Es funktioniert gut. Ich hoffe, es wird jemandem helfen.

1.Add folgende Juwel in Gemfile:

gem "ImageResize", "~> 0.0.5" 

2.run Bündel

3.use dies in Funktionsregler:

require 'rubygems' 
require 'ImageResize' 

#input_image_filename, output_image_filename, max_width, max_height 
Image.resize('big.jpg', 'small.jpg', 40, 40) 
+3

NB: Erfordert Java – robd

1

Es gibt ein Juwel namens "Refile". Es ist großartig. Gehen Sie weiter und schauen Sie sich dieses Tutorial an, um es zu benutzen. https://gorails.com/episodes/file-uploads-with-refile hier ist, wie es geht.

zu Ihrem Juwel Fügen Sie diese

Datei
gem 'refile', '~> 0.4.2', require: ["refile/rails", "refile/image_processing"] 

Erstellen eines Tabellenfeld mit Schienen Migration in der Tabelle als image_id von String type.Now kommt, wie in dieses Feld einfügen und das Bild anzuzeigen.

Verwenden Sie dies in Ihrem Upload-Formular, größtenteils form_for do | f |

<%= f.attachment_field :image %> 

Wenn Sie Schienen 4 verwenden, stellen Sie sicher, dass Sie Schienen starke Parameter übergeben.

Setzen Sie dies in Ihr Modell.rb-Datei, wo Sie das Bild speichern (unter Klassenmodellname)

attachment :image 

Anzeige des Bildes ist einfach.

<%= image_tag attachment_url(current_user,:image, :fill, 200, 170, format: "jpg") %> 
+0

Nur meine Post bearbeitet. @MamounBenghezal –