ires 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](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
|