Как повернуть изображение JPEG на 45 ° и сохранить его на диск в Haskell? - PullRequest
6 голосов
/ 05 августа 2010

Как повернуть изображение JPEG на 45 ° и сохранить его на диск?

Ответы [ 3 ]

8 голосов
/ 05 августа 2010

Насколько я знаю, для Haskell еще нет хорошей библиотеки для работы с изображениями.

Лучший способ

Вы можете использовать hsmagick (привязки к libmagick) для работы с изображениями.

См. Ответ TomMD для примера.

Простой способ

Но если вы хотите сделать это из Haskell, это может сработать (при условии, чтоImageMagick доступен):

import System.Cmd (system)
import System.Environment (getArgs)

main = do
  (original:rotated:_) <- getArgs
  system $ "convert -rotate \"-45\" \"" ++ original ++ "\" \"" ++ rotated ++ "\""

Использование:

runghc rotate.hs original.jpg rotated45.jpg

Трудный путь

Или вы можете выбрать сложный путь и реализовать алгоритм вращения сам.Для чтения и записи практически всех графических форматов в Haskell вы можете использовать библиотеку Codec.Image.DevIL .Если вы сделаете это, вы будете любезны поместить этот код в Hackage.

6 голосов
/ 05 августа 2010

Библиотека GD позволяет вам делать это, но привязки Haskell (http://hackage.haskell.org/package/gd) не включают соответствующую функцию в данный момент.Также можно было бы либо сделать запрос функции для сопровождающего, либо просто пропатчить его и отправить его в апстрим.Модуль Graphics.GD.Internal (не экспортируемый) фактически уже имеет закомментированную привязку к соответствующей функции (http://hackage.haskell.org/packages/archive/gd/3000.5.0/doc/html/src/Graphics-GD-Internal.html), поэтому, я полагаю, завершить работу должно быть очень просто (иуверен, работа будет оценена по достоинству).

5 голосов
/ 05 августа 2010

Оглянись на Hackage. Я знаю, что Тим начал работать над привязками к libmagick, чего было недостаточно, чтобы я не переключился на создание сценария-фу для GIMP, когда мне нужно было манипулировать изображениями, но для вас этого достаточно, если вы просто делать простые вещи, такие как вращение:

liftM (rotateImage 45) (readImage file) >>= writeImage file2

Я вижу, что у Кейла также есть ImLib , который выглядит более полным:

loadImageImmediately file >>= contextSetImage >>
createRotatedImage 45 >>= contextSetImage >> saveImage file2

Как я уже сказал, оглянись и дай нам знать!

...