Я создаю приложение Rails, которое размещено на Heroku и позволяет пользователю на лету генерировать анимированные GIF-файлы на основе оригинального JPG-файла, размещенного где-то в сети (представьте, что это приложение с изменяемым размером).Я попробовал Paperclip, но, AFAIK, он не обрабатывает динамически генерируемые файлы.Я использую гем aws-sdk
, и это фрагмент кода моего контроллера:
im = Magick::Image.read(@animation.url).first
fr1 = im.crop(@animation.x1,@animation.y1,@animation.width,@animation.height,true)
str1 = fr1.to_blob
fr2 = im.crop(@animation.x2,@animation.y2,@animation.width,@animation.height,true)
str2 = fr2.to_blob
list = Magick::ImageList.new
list.from_blob(str1)
list.from_blob(str2)
list.delay = @animation.delay
list.iterations = 0
Это базовое создание двухкадровой анимации.RMagick может генерировать GIF на моем компьютере для разработки с помощью следующих строк:
list.write("#{Rails.public_path}/images/" + @animation.filename)
Я попытался загрузить структуру list
в S3:
# upload to Amazon S3
s3 = AWS::S3.new
bucket = s3.buckets['mybucket']
obj = bucket.objects[@animation.filename]
obj.write(:single_request => true, :content_type => 'image/gif', :data => list)
Но у меня нет size
метод в RMagick::ImageList
, который я могу использовать, чтобы указать это.Я попытался «предварительно скомпилировать» GIF в другой RMagick::Image
:
anim = Magick::Image.new(@animation.width, @animation.height)
anim.format = "GIF"
list.write(anim)
Но Rails падает с ошибкой сегментации:
/path/to/my_controller.rb:103: [BUG] Segmentation fault ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin11.0]
Abort trap: 6
Строка 103 соответствует list.write(anim)
.
Так что сейчас я понятия не имею, как это сделать, и буду признателен за любую помощь, которую я получу.