ires 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -22
- data/ext/main.go +46 -21
- data/ext/operate/image.go +8 -8
- data/ext/util/uri/uri.go +25 -16
- data/lib/ires/service.rb +4 -4
- data/lib/ires/version.rb +1 -1
- data/lib/ires/view_helper.rb +28 -4
- data/shared/darwin/ires.h +3 -3
- data/shared/darwin/ires.so +0 -0
- data/shared/linux/ires.h +3 -3
- data/shared/linux/ires.so +0 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 023001af021142239fda30dfb1e8175965e7d88c
|
4
|
+
data.tar.gz: b7680a40d6a9a75cdc543db2e74e5a3a3f87d483
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a87de597b8b366c7351030ed3cd902f1b1b8f9fe9f0f62bbd6bf8a7868dbd543f31451b6b0727c1a7abf836688faa8788df5314bb700d3c251ae599ce0b180b
|
7
|
+
data.tar.gz: 5b09fde65eb7f157cdc29a0f92722c279c04684995fa9c5e4c18de609582ba029ffd9a45dd669e2cf328828ba00d8ddec2f5869b1fda27be9a86b8d7e2ad4d3c
|
data/README.md
CHANGED
@@ -1,4 +1,8 @@
|
|
1
1
|
# Ires
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/ires.svg)](https://badge.fury.io/rb/ires)
|
4
|
+
|
5
|
+
|
2
6
|
`Ires` is image resizer gem.
|
3
7
|
|
4
8
|
## Usage
|
@@ -19,32 +23,51 @@
|
|
19
23
|
| Cropping | crop |
|
20
24
|
| Rsize after Cropping | rsize_to_crop |
|
21
25
|
|
26
|
+
|
27
|
+
### Specify cache expiration
|
28
|
+
|
29
|
+
Default: **30days**
|
30
|
+
|
31
|
+
```erb
|
32
|
+
<%= ires_tag( path: "/image.jpg", width: 400, height: 300, expire: 7.days ) %>
|
33
|
+
```
|
34
|
+
|
22
35
|
### Saved directory
|
23
36
|
|
24
37
|
```
|
25
38
|
.
|
26
|
-
└──
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
└── public
|
40
|
+
├── image.jpg
|
41
|
+
└── ires
|
42
|
+
├── crop
|
43
|
+
│ ├── 150x150
|
44
|
+
│ │ └── 20171012_image.jpg
|
45
|
+
│ ├── 200x170
|
46
|
+
│ │ └── 20171019_image.jpg
|
47
|
+
│ ├── 400x300
|
48
|
+
│ │ └── 20171028_image.jpg
|
49
|
+
│ └── 640x480
|
50
|
+
│ └── 20171005_image.jpg
|
51
|
+
├── original
|
52
|
+
│ └── original
|
53
|
+
├── resize
|
54
|
+
│ ├── 150x150
|
55
|
+
│ │ └── 20171012_image.jpg
|
56
|
+
│ ├── 200x170
|
57
|
+
│ │ └── 20171019_image.jpg
|
58
|
+
│ ├── 400x300
|
59
|
+
│ │ └── 20171028_image.jpg
|
60
|
+
│ └── 640x480
|
61
|
+
│ └── 20171005_image.jpg
|
62
|
+
└── resize_to_crop
|
63
|
+
├── 150x150
|
64
|
+
│ └── 20171012_image.jpg
|
65
|
+
├── 200x170
|
66
|
+
│ └── 20171019_image.jpg
|
67
|
+
├── 400x300
|
68
|
+
│ └── 20171028_image.jpg
|
69
|
+
└── 640x480
|
70
|
+
└── 20171005_image.jpg
|
48
71
|
```
|
49
72
|
|
50
73
|
`original` directory where downloaded images are saved.
|
data/ext/main.go
CHANGED
@@ -14,47 +14,64 @@ const (
|
|
14
14
|
IMAGE_MODE_RESIZE int = iota
|
15
15
|
IMAGE_MODE_CROP
|
16
16
|
IMAGE_MODE_RESIZE_TO_CROP
|
17
|
+
IMAGE_MODE_ORIGINAL
|
17
18
|
)
|
18
19
|
|
19
20
|
func init() {}
|
20
21
|
func main() {}
|
21
22
|
|
22
23
|
//export resizeImage
|
23
|
-
func resizeImage(Uri *C.char, width, height int, Dir *C.char) *C.char {
|
24
|
-
|
25
|
-
|
24
|
+
func resizeImage(Uri *C.char, width, height int, Dir, Expire *C.char) *C.char {
|
25
|
+
uri := C.GoString(Uri)
|
26
|
+
dir := C.GoString(Dir)
|
27
|
+
expire := C.GoString(Expire)
|
26
28
|
|
27
29
|
size := []int{width, height}
|
28
|
-
path := util.NewImagePath(uri, dir, IMAGE_MODE_RESIZE, size...)
|
30
|
+
path := util.NewImagePath(uri, dir, expire, IMAGE_MODE_RESIZE, size...)
|
31
|
+
originalPath := util.NewImagePath(uri, dir, expire, IMAGE_MODE_ORIGINAL)
|
32
|
+
|
33
|
+
// Delete the expiration date image
|
34
|
+
util.DeleteExpireImage(uri, dir, IMAGE_MODE_RESIZE, size...)
|
29
35
|
|
30
36
|
// When the image exists, return the image path
|
31
|
-
if
|
37
|
+
if util.IsExistsImage(path) {
|
32
38
|
return C.CString(strings.Replace(path, dir, "", -1))
|
33
39
|
}
|
34
40
|
|
35
|
-
inputImg, _ := operate.InputImage(uri,
|
41
|
+
inputImg, _, isImageExist := operate.InputImage(uri, originalPath)
|
42
|
+
if !isImageExist {
|
43
|
+
return C.CString(uri)
|
44
|
+
}
|
36
45
|
outputImg := resize.Resize(uint(width), uint(height), inputImg, resize.Lanczos3)
|
37
46
|
|
38
|
-
_, filePath := operate.CreateImage(outputImg, path)
|
47
|
+
_, filePath, _ := operate.CreateImage(outputImg, path)
|
39
48
|
|
40
49
|
fileName := strings.Replace(filePath, dir, "", -1)
|
41
50
|
return C.CString(fileName)
|
42
51
|
}
|
43
52
|
|
44
53
|
//export cropImage
|
45
|
-
func cropImage(Uri *C.char, width, height int, Dir *C.char) *C.char {
|
46
|
-
|
47
|
-
|
54
|
+
func cropImage(Uri *C.char, width, height int, Dir, Expire *C.char) *C.char {
|
55
|
+
uri := C.GoString(Uri)
|
56
|
+
dir := C.GoString(Dir)
|
57
|
+
expire := C.GoString(Expire)
|
48
58
|
|
49
59
|
size := []int{width, height}
|
50
|
-
path := util.NewImagePath(uri, dir, IMAGE_MODE_CROP, size...)
|
60
|
+
path := util.NewImagePath(uri, dir, expire, IMAGE_MODE_CROP, size...)
|
61
|
+
originalPath := util.NewImagePath(uri, dir, expire, IMAGE_MODE_ORIGINAL)
|
62
|
+
|
63
|
+
// Delete the expiration date image
|
64
|
+
util.DeleteExpireImage(uri, dir, IMAGE_MODE_CROP, size...)
|
51
65
|
|
52
66
|
// When the image exists, return the image path
|
53
|
-
if
|
67
|
+
if util.IsExistsImage(path) {
|
54
68
|
return C.CString(strings.Replace(path, dir, "", -1))
|
55
69
|
}
|
56
70
|
|
57
|
-
inputImg, _ := operate.InputImage(uri,
|
71
|
+
inputImg, _, isImageExist := operate.InputImage(uri, originalPath)
|
72
|
+
if !isImageExist {
|
73
|
+
return C.CString(uri)
|
74
|
+
}
|
58
75
|
outputImg, _ := cutter.Crop(inputImg, cutter.Config{
|
59
76
|
Width: width,
|
60
77
|
Height: height,
|
@@ -62,28 +79,36 @@ func cropImage(Uri *C.char, width, height int, Dir *C.char) *C.char {
|
|
62
79
|
Options: cutter.Copy,
|
63
80
|
})
|
64
81
|
|
65
|
-
_, filePath := operate.CreateImage(outputImg, path)
|
82
|
+
_, filePath, _ := operate.CreateImage(outputImg, path)
|
66
83
|
|
67
84
|
fileName := strings.Replace(filePath, dir, "", -1)
|
68
85
|
return C.CString(fileName)
|
69
86
|
}
|
70
87
|
|
71
88
|
//export resizeToCropImage
|
72
|
-
func resizeToCropImage(Uri *C.char, width, height int, Dir *C.char) *C.char {
|
73
|
-
|
74
|
-
|
89
|
+
func resizeToCropImage(Uri *C.char, width, height int, Dir, Expire *C.char) *C.char {
|
90
|
+
uri := C.GoString(Uri)
|
91
|
+
dir := C.GoString(Dir)
|
92
|
+
expire := C.GoString(Expire)
|
75
93
|
|
76
94
|
size := []int{width, height}
|
77
|
-
path := util.NewImagePath(uri, dir, IMAGE_MODE_RESIZE_TO_CROP, size...)
|
95
|
+
path := util.NewImagePath(uri, dir, expire, IMAGE_MODE_RESIZE_TO_CROP, size...)
|
96
|
+
originalPath := util.NewImagePath(uri, dir, expire, IMAGE_MODE_ORIGINAL)
|
97
|
+
|
98
|
+
// Delete the expiration date image
|
99
|
+
util.DeleteExpireImage(uri, dir, IMAGE_MODE_RESIZE_TO_CROP, size...)
|
78
100
|
|
79
101
|
// When the image exists, return the image path
|
80
|
-
if
|
102
|
+
if util.IsExistsImage(path) {
|
81
103
|
return C.CString(strings.Replace(path, dir, "", -1))
|
82
104
|
}
|
83
105
|
|
84
|
-
inputImg, imgPath := operate.InputImage(uri,
|
106
|
+
inputImg, imgPath, isImageExist := operate.InputImage(uri, originalPath)
|
107
|
+
if !isImageExist {
|
108
|
+
return C.CString(uri)
|
109
|
+
}
|
85
110
|
outputImg := operate.ResizeToCrop(imgPath, size, inputImg)
|
86
|
-
_, filePath := operate.CreateImage(outputImg, path)
|
111
|
+
_, filePath, _ := operate.CreateImage(outputImg, path)
|
87
112
|
|
88
113
|
fileName := strings.Replace(filePath, dir, "", -1)
|
89
114
|
return C.CString(fileName)
|
data/ext/operate/image.go
CHANGED
@@ -12,17 +12,17 @@ import (
|
|
12
12
|
)
|
13
13
|
|
14
14
|
// 入力画像
|
15
|
-
func InputImage(uri,
|
15
|
+
func InputImage(uri, path string) (image.Image, string, bool) {
|
16
16
|
if util.IsLocalFile(uri) {
|
17
|
-
return LocalImage(uri), uri
|
17
|
+
return LocalImage(uri), uri, true
|
18
18
|
} else {
|
19
|
-
img, path := DownloadImage(uri,
|
20
|
-
return img, path
|
19
|
+
img, path, isImageExist := DownloadImage(uri, path)
|
20
|
+
return img, path, isImageExist
|
21
21
|
}
|
22
22
|
}
|
23
23
|
|
24
24
|
// http経由での画像を保存
|
25
|
-
func DownloadImage(uri, path string) (image.Image, string) {
|
25
|
+
func DownloadImage(uri, path string) (image.Image, string, bool) {
|
26
26
|
res, err := http.Get(uri)
|
27
27
|
if err != nil {
|
28
28
|
panic(err)
|
@@ -31,13 +31,13 @@ func DownloadImage(uri, path string) (image.Image, string) {
|
|
31
31
|
|
32
32
|
img, _, err := image.Decode(res.Body)
|
33
33
|
if err != nil {
|
34
|
-
|
34
|
+
return nil, path, false
|
35
35
|
}
|
36
36
|
return CreateImage(img, path)
|
37
37
|
}
|
38
38
|
|
39
39
|
// 画像を作成
|
40
|
-
func CreateImage(img image.Image, path string) (image.Image, string) {
|
40
|
+
func CreateImage(img image.Image, path string) (image.Image, string, bool) {
|
41
41
|
file, err := os.Create(path)
|
42
42
|
if err != nil {
|
43
43
|
panic(err)
|
@@ -46,7 +46,7 @@ func CreateImage(img image.Image, path string) (image.Image, string) {
|
|
46
46
|
|
47
47
|
jpeg.Encode(file, img, nil)
|
48
48
|
|
49
|
-
return LocalImage(path), path
|
49
|
+
return LocalImage(path), path, true
|
50
50
|
}
|
51
51
|
|
52
52
|
// ローカルの画像を取得
|
data/ext/util/uri/uri.go
CHANGED
@@ -5,7 +5,7 @@ import (
|
|
5
5
|
"path/filepath"
|
6
6
|
"strconv"
|
7
7
|
"strings"
|
8
|
-
"
|
8
|
+
"time"
|
9
9
|
)
|
10
10
|
|
11
11
|
// ローカルの画像かどうか
|
@@ -26,19 +26,16 @@ func getImageName(uri string) (string, string) {
|
|
26
26
|
}
|
27
27
|
|
28
28
|
// 画像のフルパスを生成
|
29
|
-
func NewImagePath(uri, dir string, mode int, size ...int) string {
|
30
|
-
name := NewImageName(uri,
|
29
|
+
func NewImagePath(uri, dir, expire string, mode int, size ...int) string {
|
30
|
+
name := NewImageName(uri, expire)
|
31
31
|
return FilePath(name, dir, mode, size...)
|
32
32
|
}
|
33
33
|
|
34
34
|
// ファイル名を生成
|
35
|
-
func NewImageName(uri
|
35
|
+
func NewImageName(uri, expire string) string {
|
36
36
|
imageName, ext := getImageName(uri)
|
37
|
-
|
38
|
-
|
39
|
-
}
|
40
|
-
imageName += ext
|
41
|
-
return imageName
|
37
|
+
fullImageName := expire + "_" + imageName + ext
|
38
|
+
return fullImageName
|
42
39
|
}
|
43
40
|
|
44
41
|
// 画像を保存するパスの設定
|
@@ -53,10 +50,10 @@ func FilePath(name string, d string, mode int, size ...int) string {
|
|
53
50
|
// 画像格納先
|
54
51
|
var oDir string
|
55
52
|
switch mode {
|
56
|
-
case 0:
|
57
|
-
case 1:
|
58
|
-
case 2:
|
59
|
-
|
53
|
+
case 0: oDir = "ires/resize"
|
54
|
+
case 1: oDir = "ires/crop"
|
55
|
+
case 2: oDir = "ires/resize_to_crop"
|
56
|
+
case 3: oDir = "ires/original"
|
60
57
|
}
|
61
58
|
|
62
59
|
var prefix string
|
@@ -86,11 +83,23 @@ func PrefixSize(size ...int) string {
|
|
86
83
|
}
|
87
84
|
|
88
85
|
// リサイズ済みのファイルがあれば、処理せず返す
|
89
|
-
func
|
90
|
-
_, err :=
|
91
|
-
if err
|
86
|
+
func IsExistsImage(path string) bool {
|
87
|
+
_, err := os.Stat(path)
|
88
|
+
if err == nil {
|
92
89
|
return true
|
93
90
|
} else {
|
94
91
|
return false
|
95
92
|
}
|
93
|
+
}
|
94
|
+
|
95
|
+
// 有効期限に達した画像を削除
|
96
|
+
func DeleteExpireImage(uri, dir string, mode int, size ...int) {
|
97
|
+
today := time.Now().Format("20060102")
|
98
|
+
path := NewImagePath(uri, dir, today, mode, size...)
|
99
|
+
_, err := os.Stat(path)
|
100
|
+
if err == nil {
|
101
|
+
if err := os.Remove(path); err != nil {
|
102
|
+
panic(err)
|
103
|
+
}
|
104
|
+
}
|
96
105
|
}
|
data/lib/ires/service.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'ffi'
|
2
2
|
require 'ires/util'
|
3
3
|
|
4
4
|
module Ires
|
@@ -12,8 +12,8 @@ module Ires
|
|
12
12
|
ffi_lib File.expand_path("../../shared/#{os}/ires.so", File.dirname(__FILE__))
|
13
13
|
|
14
14
|
# resize func
|
15
|
-
attach_function :resizeImage, [:string, :int, :int, :string], :string
|
16
|
-
attach_function :cropImage, [:string, :int, :int, :string], :string
|
17
|
-
attach_function :resizeToCropImage, [:string, :int, :int, :string], :string
|
15
|
+
attach_function :resizeImage, [:string, :int, :int, :string, :string], :string
|
16
|
+
attach_function :cropImage, [:string, :int, :int, :string, :string], :string
|
17
|
+
attach_function :resizeToCropImage, [:string, :int, :int, :string, :string], :string
|
18
18
|
end
|
19
19
|
end
|
data/lib/ires/version.rb
CHANGED
data/lib/ires/view_helper.rb
CHANGED
@@ -1,19 +1,43 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
1
3
|
module Ires
|
2
4
|
module ViewHelper
|
3
5
|
|
4
6
|
# Image resize
|
5
7
|
# return [image_tag]
|
6
|
-
def ires_tag(path:, width:, height:, mode: "resize", **option)
|
8
|
+
def ires_tag(path:, width:, height:, mode: "resize", expire: 30.days, **option)
|
7
9
|
full_path = image_full_path(path.to_s)
|
8
10
|
|
11
|
+
# if no image or could not find file path then perform the same action as 'image_tag'
|
12
|
+
return image_tag(path, option) if !File.exist?(full_path) && !full_path.include?("http")
|
13
|
+
|
14
|
+
# Expiration date (default: 7.days)
|
15
|
+
# ex. "20170101"
|
16
|
+
expiration_date = (Date.today + expire).strftime("%Y%m%d")
|
17
|
+
|
9
18
|
# Reszie image
|
10
19
|
case mode
|
11
20
|
when "resize"
|
12
|
-
@image = Ires::Service.resizeImage(
|
21
|
+
@image = Ires::Service.resizeImage(
|
22
|
+
full_path,
|
23
|
+
width,
|
24
|
+
height,
|
25
|
+
image_dir,
|
26
|
+
expiration_date)
|
13
27
|
when "crop"
|
14
|
-
@image = Ires::Service.cropImage(
|
28
|
+
@image = Ires::Service.cropImage(
|
29
|
+
full_path,
|
30
|
+
width,
|
31
|
+
height,
|
32
|
+
image_dir,
|
33
|
+
expiration_date)
|
15
34
|
when "resize_to_crop"
|
16
|
-
@image = Ires::Service.resizeToCropImage(
|
35
|
+
@image = Ires::Service.resizeToCropImage(
|
36
|
+
full_path,
|
37
|
+
width,
|
38
|
+
height,
|
39
|
+
image_dir,
|
40
|
+
expiration_date)
|
17
41
|
end
|
18
42
|
|
19
43
|
return nil if @image.nil?
|
data/shared/darwin/ires.h
CHANGED
@@ -53,11 +53,11 @@ extern "C" {
|
|
53
53
|
#endif
|
54
54
|
|
55
55
|
|
56
|
-
extern char* resizeImage(char* p0, GoInt p1, GoInt p2, char* p3);
|
56
|
+
extern char* resizeImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
57
57
|
|
58
|
-
extern char* cropImage(char* p0, GoInt p1, GoInt p2, char* p3);
|
58
|
+
extern char* cropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
59
59
|
|
60
|
-
extern char* resizeToCropImage(char* p0, GoInt p1, GoInt p2, char* p3);
|
60
|
+
extern char* resizeToCropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
61
61
|
|
62
62
|
#ifdef __cplusplus
|
63
63
|
}
|
data/shared/darwin/ires.so
CHANGED
Binary file
|
data/shared/linux/ires.h
CHANGED
@@ -53,11 +53,11 @@ extern "C" {
|
|
53
53
|
#endif
|
54
54
|
|
55
55
|
|
56
|
-
extern char* resizeImage(char* p0, GoInt p1, GoInt p2, char* p3);
|
56
|
+
extern char* resizeImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
57
57
|
|
58
|
-
extern char* cropImage(char* p0, GoInt p1, GoInt p2, char* p3);
|
58
|
+
extern char* cropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
59
59
|
|
60
|
-
extern char* resizeToCropImage(char* p0, GoInt p1, GoInt p2, char* p3);
|
60
|
+
extern char* resizeToCropImage(char* p0, GoInt p1, GoInt p2, char* p3, char* p4);
|
61
61
|
|
62
62
|
#ifdef __cplusplus
|
63
63
|
}
|
data/shared/linux/ires.so
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ires
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- enta0701
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|