2011-11-03 28 views
5

Tôi muốn Carrierwave để tạo ra một vài phiên bản của hình ảnh, một ở định dạng png và một ở định dạng jpeg, nhưng tôi không thể làm cho nó hoạt động. Tôi nhận ra một số câu hỏi tương tự đã được hỏi cả ở đây và ở nơi khác, nhưng tôi đã thất bại trong việc tìm một giải pháp. Đại khái, đây là những gì tôi có:Sự cố với Carrierwave: chuyển đổi

class MyUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 

    version :jpeg do 
    process :convert => 'jpg' 
    # more procesors 
    process :processed => :jpg 
    end 

    version :png do 
    process :convert => 'png' 
    # more processors 
    process :processed => :png 
    end 

    def store_path(for_file = filename) 
    if version_name != :png 
     return "#{version_name}.jpg" 
    else 
     return "#{version_name}.png" 
    end 
    end 

    def filename 
    filename = if version_name != :png 
     super != nil ? super.split('.').first + '.jpg' : super 
    else 
     super != nil ? super.split('.').first + '.png' : super 
    end 
    end 

end 

Vì vậy, không phụ thuộc vào loại định dạng hình ảnh tôi vượt qua trong, điều này tạo ra hai tập tin: một trong những tên jpg.jpg, và một trong những tên png.png. jpg.jpg thực sự luôn là tệp JPEG (như được xác minh bằng lệnh file của Unix), NHƯNG png.png chỉ là tệp PNG được định dạng đúng nếu và chỉ khi ban đầu tôi chuyển vào tệp png-formated (chuyển vào kết quả jpeg trong tệp có định dạng jpeg) !

Ý tưởng?

này có thể không có ích, nhưng tôi tìm ra phương pháp convert trong Carrierwave bản thân đáng ngờ: convert(some_format) cuộc gọi manipulate!(:format => some_format), nó sẽ gọi (some_image_object).write("#{some_format}:#{current_path}"). Bây giờ nếu hình ảnh ban đầu được truyền vào là bla.format (định dạng = jpg, png, v.v.), current_path có phần mở rộng của .format (được kiểm tra qua một miếng vá khỉ trên manipulate!). Và cách chuyển đổi định dạng hình ảnh hoạt động trong RMagick bằng cách gọi số write với đối số có tiện ích mở rộng mong muốn. Vậy tại sao chuyển đổi jpeg ở trên thực sự xảy ra? Và nếu vậy, tại sao chuyển đổi png sẽ thất bại?

Ngoài ra, nếu nó hữu ích, tôi đang ở trên Rails 3.0.9 và Carrierwave 0.5.6

Cảm ơn!

Trả lời

5

Vì vậy, tôi không chắc chắn lý do tại sao đây là trường hợp, nhưng nó chỉ ra rằng vấn đề nằm trong phần # more processors của phiên bản png mà tôi đã ẩn ở trên. Bỏ qua chúng từ phiên bản dẫn đến tệp PNG chính hãng cho bất kỳ loại đầu vào nào. Những bộ xử lý này gọi manipulate! và thực hiện một số nội dung. Thay vào đó, sửa chữa để gọi số manipulate!(:format => 'png'). Yay.

+0

cảm ơn, bạn đã lưu đêm của tôi –

+1

Bất kỳ ai khác nhìn vào câu trả lời này đều có thể đọc: http://stackoverflow.com/questions/19625066/carrierwave-rmagick-not-removing-transparency-in-convert-to-jpg – JakeTheSnake

Các vấn đề liên quan