From 5b2d7538adc890575edf1926c4b03bc37cd4922e Mon Sep 17 00:00:00 2001 From: Aaron Fischer Date: Sun, 26 Feb 2017 23:43:17 +0100 Subject: [PATCH] Finish the image processing --- project.clj | 22 ++++++---- resources/public/css/screen.css | 73 ++------------------------------- src/clj/yenu/helpers/images.clj | 69 +++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 78 deletions(-) create mode 100644 src/clj/yenu/helpers/images.clj diff --git a/project.clj b/project.clj index 66e2241..6f03ac9 100644 --- a/project.clj +++ b/project.clj @@ -1,6 +1,6 @@ (defproject yenu "0.1.0-SNAPSHOT" - :description "FIXME: write description" + :description "yenu -- The image sharing tool for friends" :url "http://example.com/FIXME" :dependencies [[bouncer "1.0.0"] @@ -30,7 +30,11 @@ [ring/ring-core "1.5.1"] [ring/ring-defaults "0.2.3"] [secretary "1.2.3"] - [selmer "1.10.6"]] + [selmer "1.10.6"] + [image-resizer "0.1.9"] + [me.raynes/fs "1.4.6"] + [digest "1.4.5"] + [clj-exif-orientation "0.2.1"]] :min-lein-version "2.0.0" @@ -47,14 +51,14 @@ [lein-immutant "2.1.0"] [lein-sassc "0.10.4"] [lein-auto "0.1.2"]] - :sassc - [{:src "resources/scss/screen.scss" - :output-to "resources/public/css/screen.css" - :style "nested" - :import-path "resources/scss"}] + :sassc + [{:src "resources/scss/screen.scss" + :output-to "resources/public/css/screen.css" + :style "nested" + :import-path "resources/scss"}] - :auto - {"sassc" {:file-pattern #"\.(scss|sass)$" :paths ["resources/scss"]}} + :auto + {"sassc" {:file-pattern #"\.(scss|sass)$" :paths ["resources/scss"]}} :hooks [leiningen.sassc] :clean-targets ^{:protect false} diff --git a/resources/public/css/screen.css b/resources/public/css/screen.css index 3a8307f..0b6a61c 100644 --- a/resources/public/css/screen.css +++ b/resources/public/css/screen.css @@ -1,69 +1,4 @@ -html, -body { - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - height: 100%; -} -.navbar { - margin-bottom: 10px; - border-radius: 0px; -} -.navbar-brand { - float: none; -} -.navbar-nav .nav-item { - float: none; -} -.navbar-divider, -.navbar-nav .nav-item+.nav-item, -.navbar-nav .nav-link + .nav-link { - margin-left: 0; -} -@media (min-width: 34em) { - .navbar-brand { - float: left; - } - .navbar-nav .nav-item { - float: left; - } - .navbar-divider, - .navbar-nav .nav-item+.nav-item, - .navbar-nav .nav-link + .nav-link { - margin-left: 1rem; - } -} - -@-moz-keyframes three-quarters-loader { - 0% { - -moz-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@-webkit-keyframes three-quarters-loader { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} -@keyframes three-quarters-loader { - 0% { - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + height: 100%; + padding-top: 40px; } diff --git a/src/clj/yenu/helpers/images.clj b/src/clj/yenu/helpers/images.clj new file mode 100644 index 0000000..88bebb9 --- /dev/null +++ b/src/clj/yenu/helpers/images.clj @@ -0,0 +1,69 @@ +(ns yenu.helpers.images + (:require [image-resizer.core :refer :all] + [image-resizer.util :as utils] + [image-resizer.format :refer :all] + [image-resizer.crop :refer :all] + [clojure.java.io :as io] + [digest :as digest] + [me.raynes.fs :as fs] + [clj-exif-orientation.core :as exif] + [yenu.config :refer [env]])) + +(defn create-needed-folders [] + (if (not (fs/exists? (data-path "to-process"))) + (fs/mkdirs (data-path "to-process"))) + (if (not (fs/exists? (data-path "gallery"))) + (map #(fs/mkdirs (data-path "gallery" %)) + ["normal" "raw" "thumbnails"]))) + +;;; HINT: To use the env function, the webserver need to be started with +;;; (start) in the 'user namespace. +(defn data-path + ([] (data-path "")) + ([& args] + (let [postfix (apply io/file args)] + (.getPath (io/file (env :user-dir) "data" postfix))))) + +(defn target-image-filename [image-file-path] + (let [file (io/file image-file-path)] + (str (.lastModified file) "-" (digest/md5 file)))) + + +(defn scale-thumbnail [width] + #(let [image-file % + [orig-width orig-height] (dimensions (utils/buffered-image image-file))] + (if (< orig-width orig-height) + (let [resized-img (resize-to-width image-file width) + [w h] (dimensions resized-img) + crop-margin (quot (- h width) 2)] + (crop-from resized-img 0 crop-margin width width)) + (let [resized-img (resize-to-height image-file width) + [w h] (dimensions resized-img) + crop-margin (quot (- w width) 2)] + (crop-from resized-img crop-margin 0 width width))))) + +(defn scale-normal [width height] + #(resize % width height)) + +(defn save [fn params filepath target-filepath] + (let [file (exif/without-exif (io/file filepath))] + (as-file ((apply fn params) file) + target-filepath + :verbatim))) + +(defn scale-image-and-save [filepath] + (let [image-hash (target-image-filename filepath) + file-extension (fs/extension filepath) + new-file-name (str image-hash file-extension)] + (fs/copy filepath (data-path "gallery" "raw" new-file-name)) + (save scale-normal [1024 768] filepath (data-path "gallery" "normal" new-file-name)) + (save scale-thumbnail [250] filepath (data-path "gallery" "thumbnails" new-file-name)) + image-hash)) + +(defn process-image [filepath] + (let [image-hash (scale-image-and-save filepath)] + (fs/delete filepath) + image-hash)) + +(defn process-all-images [] + (pmap process-image (fs/list-dir (data-path "to-process"))))