core_image 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/LICENSE +20 -0
- data/README.md +47 -0
- data/Rakefile +14 -0
- data/core_image.gemspec +17 -0
- data/lib/core_image.rb +83 -31
- data/test/core_image_test.rb +103 -0
- data/test/images/overlay.png +0 -0
- data/test/images/test.pdf +0 -0
- data/test/images/test.png +0 -0
- metadata +46 -10
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Spencer Rogers
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
## Core Image Gem ##
|
2
|
+
Simple image manipulation using Apple's Core Image technology.
|
3
|
+
|
4
|
+
### Installation ###
|
5
|
+
`gem install core_image`
|
6
|
+
|
7
|
+
### Usage ###
|
8
|
+
require 'core_image'
|
9
|
+
image = CoreImage.new(location) # more on this below
|
10
|
+
image.rotate(90)
|
11
|
+
image.scale_to_size(300)
|
12
|
+
image.save
|
13
|
+
|
14
|
+
### Supports Chaining ###
|
15
|
+
image.rotate(90).scale(0.6).save(new_path)
|
16
|
+
|
17
|
+
### Extra Bits ###
|
18
|
+
image.flip_horizontally
|
19
|
+
image.flip_vertically
|
20
|
+
image.save # oh no!
|
21
|
+
image.revert #=> reverts to the original image
|
22
|
+
|
23
|
+
### One More Thing! ###
|
24
|
+
image.tint({:red => 0, :green => 0, :blue => 255, :alpha => 1.0})
|
25
|
+
image.crop(x, y, w, h) # starts from lower left
|
26
|
+
image.color_at(x, y) # => RGB Hash of specified pixel
|
27
|
+
image.overlay(another_image) # follows the same instantiation rules
|
28
|
+
|
29
|
+
|
30
|
+
### Instantiating ###
|
31
|
+
You can instantiate a new Core Image object with the following:
|
32
|
+
* A path to a file
|
33
|
+
* A url to a file
|
34
|
+
* An Apple image object: NSImage, CIImage, CGImage
|
35
|
+
* Another Core Image object
|
36
|
+
|
37
|
+
### File Types ###
|
38
|
+
Core Image can open and save the following formats: jpeg, png, tiff, gif, pct, and bmp. It can also open pdfs and save them as one of the previously listed image formats.
|
39
|
+
|
40
|
+
### Requirements ###
|
41
|
+
Requires Mac OS X to run.
|
42
|
+
|
43
|
+
### Tests ###
|
44
|
+
Core Image testing is done via the [Riot](http://rubygems.org/gems/riot) gem and can be run by typing `rake` from the root directory of this repository (you must have Riot installed to do so).
|
45
|
+
|
46
|
+
### Support ###
|
47
|
+
Serveral updates are in the works but feel free to report issues, make comments, voice concerns and I'll get to them when I can! Enjoy!
|
data/Rakefile
ADDED
data/core_image.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "core_image"
|
3
|
+
spec.version = "0.0.3"
|
4
|
+
spec.date = "2012-01-31"
|
5
|
+
spec.summary = "Manipulate images via Apple's built-in Core Image technology"
|
6
|
+
spec.description = "Simple image manipulation using Apple's Core Image technology. Scale, rotate, flip, convert, overlay, and more."
|
7
|
+
spec.author = "Spencer Rogers"
|
8
|
+
spec.email = "SpencerRogers@gmail.com"
|
9
|
+
spec.files = `git ls-files`.split("\n")
|
10
|
+
spec.test_files = ['test/core_image_test.rb']
|
11
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
spec.require_paths = ["lib"]
|
13
|
+
spec.add_development_dependency "rubygems"
|
14
|
+
spec.add_development_dependency "riot"
|
15
|
+
spec.homepage = "https://github.com/serogers/core_image"
|
16
|
+
spec.requirements << ["Mac OS X"]
|
17
|
+
end
|
data/lib/core_image.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
class CoreImage
|
6
6
|
require 'osx/cocoa'
|
7
|
+
require 'uri'
|
7
8
|
|
8
9
|
attr_accessor :image_path
|
9
10
|
attr_accessor :original_image
|
@@ -24,29 +25,31 @@ class CoreImage
|
|
24
25
|
scale(dimensions[:ratio])
|
25
26
|
end
|
26
27
|
|
27
|
-
def rotate(degrees =
|
28
|
+
def rotate(degrees = 90)
|
28
29
|
radians = degrees_to_radians(degrees)
|
29
30
|
transform = OSX::CGAffineTransformMakeRotation(radians)
|
30
31
|
self.ciimage = self.ciimage.imageByApplyingTransform(transform)
|
31
32
|
self
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
+
def flip_horizontally
|
35
36
|
transform = OSX::CGAffineTransformMakeScale(-1.0, 1.0)
|
36
37
|
self.ciimage = self.ciimage.imageByApplyingTransform(transform)
|
37
38
|
self
|
38
39
|
end
|
39
40
|
|
40
|
-
def
|
41
|
-
|
41
|
+
def flip_vertically
|
42
|
+
flip_horizontally.rotate(180)
|
43
|
+
end
|
44
|
+
|
45
|
+
def crop(x, y, w, h) # coordinates start in lower left
|
42
46
|
self.ciimage = self.ciimage.imageByCroppingToRect(OSX::CGRectMake(x, y, w, h))
|
43
47
|
self
|
44
48
|
end # crop
|
45
49
|
|
46
|
-
def tint(
|
47
|
-
|
48
|
-
|
49
|
-
colored_image = OSX::CIImage.imageWithColor(OSX::CIColor.colorWithString(rgb_string))
|
50
|
+
def tint(rgb)
|
51
|
+
context = set_context
|
52
|
+
colored_image = OSX::CIImage.imageWithColor(OSX::CIColor.colorWithString(rgb_hash_to_string(rgb)))
|
50
53
|
filter = OSX::CIFilter.filterWithName("CIMultiplyCompositing")
|
51
54
|
filter.setValue_forKey(colored_image, "inputImage")
|
52
55
|
filter.setValue_forKey(self.ciimage, "inputBackgroundImage")
|
@@ -56,10 +59,9 @@ class CoreImage
|
|
56
59
|
self
|
57
60
|
end
|
58
61
|
|
59
|
-
def
|
62
|
+
def overlay(object)
|
60
63
|
image = open_object(object)
|
61
|
-
|
62
|
-
context = create_ci_context(image_size[:width], image_size[:height])
|
64
|
+
context = set_context
|
63
65
|
filter = OSX::CIFilter.filterWithName("CISourceOverCompositing")
|
64
66
|
filter.setValue_forKey(image, "inputImage")
|
65
67
|
filter.setValue_forKey(self.ciimage, "inputBackgroundImage")
|
@@ -69,8 +71,15 @@ class CoreImage
|
|
69
71
|
self
|
70
72
|
end
|
71
73
|
|
72
|
-
def color_at(x, y)
|
73
|
-
|
74
|
+
def color_at(x, y) # coordinates start in upper left
|
75
|
+
set_context
|
76
|
+
nscolor = to_bitmap.colorAtX_y(x, y)
|
77
|
+
rgb = {}
|
78
|
+
rgb[:red] = (nscolor.redComponent.to_f * 255.0).to_i
|
79
|
+
rgb[:green] = (nscolor.greenComponent.to_f * 255.0).to_i
|
80
|
+
rgb[:blue] = (nscolor.blueComponent.to_f * 255.0).to_i
|
81
|
+
rgb[:alpha] = nscolor.alphaComponent
|
82
|
+
rgb
|
74
83
|
end
|
75
84
|
|
76
85
|
def to_bitmap
|
@@ -81,24 +90,31 @@ class CoreImage
|
|
81
90
|
to_bitmap.CGImage
|
82
91
|
end
|
83
92
|
|
93
|
+
def to_nsimage
|
94
|
+
image_size = self.size
|
95
|
+
nsimage_rep = OSX::NSCIImageRep.imageRepWithCIImage(self.ciimage)
|
96
|
+
nsimage = OSX::NSImage.alloc.initWithSize(OSX::NSMakeSize(image_size[:width], image_size[:height]))
|
97
|
+
nsimage.addRepresentation(nsimage_rep)
|
98
|
+
nsimage
|
99
|
+
end
|
100
|
+
|
84
101
|
def size
|
85
102
|
width, height = 0, 0
|
86
103
|
|
87
104
|
begin # sometimes ciimage.extent throws an error
|
88
|
-
|
89
|
-
width =
|
90
|
-
height =
|
105
|
+
image_size = self.ciimage.extent.size
|
106
|
+
width = image_size.width
|
107
|
+
height = image_size.height
|
91
108
|
rescue
|
92
|
-
# if image.extent fails, use another method for measuring size (by converting to a cgimage)
|
93
109
|
begin
|
94
110
|
cgimage = self.to_cgimage
|
95
111
|
width = OSX::CGImageGetWidth(cgimage)
|
96
112
|
height = OSX::CGImageGetHeight(cgimage)
|
97
|
-
rescue
|
113
|
+
rescue
|
98
114
|
width = 0
|
99
115
|
height = 0
|
100
|
-
end
|
101
|
-
end
|
116
|
+
end
|
117
|
+
end
|
102
118
|
|
103
119
|
{:width => width, :height => height}
|
104
120
|
end
|
@@ -136,18 +152,30 @@ class CoreImage
|
|
136
152
|
def open_object(object)
|
137
153
|
case object.class.to_s
|
138
154
|
when "String"
|
139
|
-
|
155
|
+
open_from_location(object)
|
140
156
|
when "OSX::CIImage"
|
141
|
-
|
157
|
+
object
|
158
|
+
when "OSX::CGImage", "OSX::NSObject"
|
159
|
+
OSX::CIImage.imageWithCGImage(object)
|
160
|
+
when "OSX::NSImage"
|
161
|
+
tiff_data = object.TIFFRepresentation
|
162
|
+
OSX::CIImage.imageWithData(tiff_data)
|
163
|
+
when "CoreImage"
|
164
|
+
object.ciimage
|
142
165
|
end
|
143
166
|
end
|
144
167
|
|
145
|
-
def
|
146
|
-
|
147
|
-
|
168
|
+
def open_from_location(string)
|
169
|
+
nsurl = valid_url?(string) ? nsurl_from_url(string) : nsurl_from_path(string)
|
170
|
+
File.extname(string).downcase == ".pdf" ? open_from_pdf(nsurl) : open_from_image_file(nsurl)
|
171
|
+
end
|
172
|
+
|
173
|
+
def open_from_image_file(nsurl)
|
174
|
+
OSX::CIImage.imageWithContentsOfURL(nsurl)
|
175
|
+
end
|
148
176
|
|
149
|
-
def
|
150
|
-
data = OSX::NSData.dataWithContentsOfURL(
|
177
|
+
def open_from_pdf(nsurl, scale = 1, dpi = 72.0, preserve_alpha = false)
|
178
|
+
data = OSX::NSData.dataWithContentsOfURL(nsurl)
|
151
179
|
pdf_rep = OSX::NSPDFImageRep.imageRepWithData(data)
|
152
180
|
nsimage = OSX::NSImage.alloc.initWithData(data)
|
153
181
|
nssize = nsimage.size
|
@@ -174,7 +202,7 @@ class CoreImage
|
|
174
202
|
cgimage = OSX::CGBitmapContextCreateImage(context.graphicsPort)
|
175
203
|
|
176
204
|
# return a ciimage
|
177
|
-
OSX::CIImage.
|
205
|
+
OSX::CIImage.imageWithCGImage(cgimage)
|
178
206
|
end
|
179
207
|
|
180
208
|
def degrees_to_radians(degrees)
|
@@ -198,7 +226,11 @@ class CoreImage
|
|
198
226
|
when ".bmp"
|
199
227
|
OSX::NSBMPFileType
|
200
228
|
end
|
201
|
-
|
229
|
+
end
|
230
|
+
|
231
|
+
def set_context
|
232
|
+
image_size = size
|
233
|
+
create_ci_context(image_size[:width], image_size[:height])
|
202
234
|
end
|
203
235
|
|
204
236
|
def create_ci_context(width, height)
|
@@ -206,10 +238,30 @@ class CoreImage
|
|
206
238
|
end
|
207
239
|
|
208
240
|
def create_ns_context(width, height)
|
209
|
-
blank_bitmap = OSX::NSBitmapImageRep.alloc.initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel(nil, width, height, 8, 4, true, false, OSX::
|
241
|
+
blank_bitmap = OSX::NSBitmapImageRep.alloc.initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel(nil, width, height, 8, 4, true, false, OSX::NSCalibratedRGBColorSpace, 0, 0)
|
210
242
|
context = OSX::NSGraphicsContext.graphicsContextWithBitmapImageRep(blank_bitmap)
|
211
243
|
OSX::NSGraphicsContext.setCurrentContext(context)
|
212
244
|
context
|
213
|
-
end
|
245
|
+
end
|
214
246
|
|
247
|
+
def rgb_hash_to_string(rgb)
|
248
|
+
rgb[:alpha] = 1.0 if rgb[:alpha].nil?
|
249
|
+
"#{rgb[:red].to_f / 255.0} #{rgb[:green].to_f / 255.0} #{rgb[:blue].to_f / 255.0} #{rgb[:alpha].to_f}"
|
250
|
+
end
|
251
|
+
|
252
|
+
def valid_url?(string)
|
253
|
+
uri = URI.parse(string)
|
254
|
+
%w( http https ).include?(uri.scheme) and uri.path.nil? == false
|
255
|
+
rescue URI::BadURIError
|
256
|
+
false
|
257
|
+
end
|
258
|
+
|
259
|
+
def nsurl_from_path(path)
|
260
|
+
OSX::NSURL.fileURLWithPath(path)
|
261
|
+
end
|
262
|
+
|
263
|
+
def nsurl_from_url(url)
|
264
|
+
OSX::NSURL.URLWithString(url)
|
265
|
+
end
|
266
|
+
|
215
267
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'riot'
|
3
|
+
require './lib/core_image.rb'
|
4
|
+
|
5
|
+
context 'Core Image' do
|
6
|
+
setup {CoreImage.new("./test/images/test.png")}
|
7
|
+
helper(:solid_blue_rgb) { {:red => 0, :green => 0, :blue => 255, :alpha => 1.0} }
|
8
|
+
|
9
|
+
context 'opens file' do
|
10
|
+
asserts("Opens image file") {topic.ciimage.nil? == false}
|
11
|
+
asserts("Opens pdf file") {CoreImage.new("./test/images/test.pdf").ciimage.nil? == false}
|
12
|
+
asserts("Opens file from the internet") {CoreImage.new("http://dl.dropbox.com/u/1848018/core_image_test.png").ciimage.nil? == false}
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'opens apple image object' do
|
16
|
+
asserts("Opens ciimage") {CoreImage.new(topic.ciimage).ciimage.class.to_s == "OSX::CIImage"}
|
17
|
+
asserts("Opens cgimage") {CoreImage.new(topic.to_cgimage).ciimage.class.to_s == "OSX::CIImage"}
|
18
|
+
asserts("Opens nsimage") {CoreImage.new(topic.to_nsimage).ciimage.class.to_s == "OSX::CIImage"}
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'opens image from self' do
|
22
|
+
asserts("Opens from core_image instantiation") {CoreImage.new(topic).ciimage.class.to_s == "OSX::CIImage"}
|
23
|
+
end
|
24
|
+
|
25
|
+
context '.scale(1.5)' do
|
26
|
+
asserts("Image was scaled up by 150%") {topic.scale(1.5).size == {:width => 75, :height => 75}}
|
27
|
+
end
|
28
|
+
|
29
|
+
context '.scale(0.6)' do
|
30
|
+
asserts("Image was scaled down by 60%") {topic.scale(0.6).size == {:width => 30, :height => 30}}
|
31
|
+
end
|
32
|
+
|
33
|
+
context '.scale_to_size(300)' do
|
34
|
+
asserts("Image was scaled to fit within 500px") {topic.scale_to_size(300).size == {:width => 300, :height => 300}}
|
35
|
+
end
|
36
|
+
|
37
|
+
context '.rotate(90)' do
|
38
|
+
setup {topic.rotate(90).color_at(10, 40)}
|
39
|
+
asserts("Image was rotated by 90 degrees") {topic == solid_blue_rgb}
|
40
|
+
end
|
41
|
+
|
42
|
+
context '.rotate(-90)' do
|
43
|
+
setup {topic.rotate(-90).color_at(40, 10)}
|
44
|
+
asserts("Image was rotated by -90 degrees") {topic == solid_blue_rgb}
|
45
|
+
end
|
46
|
+
|
47
|
+
context '.flip_horizontally' do
|
48
|
+
setup {topic.flip_horizontally.color_at(40, 10)}
|
49
|
+
asserts("Image was flipped on its x-axis") {topic == solid_blue_rgb}
|
50
|
+
end
|
51
|
+
|
52
|
+
context '.flip_vertically' do
|
53
|
+
setup {topic.flip_vertically.color_at(10, 40)}
|
54
|
+
asserts("Image was flipped on its y-axis") {topic == solid_blue_rgb}
|
55
|
+
end
|
56
|
+
|
57
|
+
context '.crop' do
|
58
|
+
setup {topic.crop(0, 0, 25, 25)}
|
59
|
+
asserts("Image was cropped to a 25 pixel box starting in lower left") {topic.size == {:width => 25, :height => 25} and topic.color_at(10, 2) == {:red => 0, :green => 128, :blue => 0, :alpha => 1.0}}
|
60
|
+
end
|
61
|
+
|
62
|
+
context '.tint' do
|
63
|
+
setup {topic.tint(solid_blue_rgb)}
|
64
|
+
asserts("Image was tinted a dark blue") {topic.color_at(40, 10) == solid_blue_rgb}
|
65
|
+
end
|
66
|
+
|
67
|
+
context '.overlay' do
|
68
|
+
setup {topic.overlay(CoreImage.new("./test/images/overlay.png")).color_at(40, 10) == solid_blue_rgb}
|
69
|
+
end
|
70
|
+
|
71
|
+
context '.color_at' do
|
72
|
+
setup {topic.color_at(10, 10)} # select pixel from blue area
|
73
|
+
asserts("Blue equals R:0, G:0, B:255, A:1.0") {topic == solid_blue_rgb}
|
74
|
+
end
|
75
|
+
|
76
|
+
context '.to_bitmap' do
|
77
|
+
setup {topic.to_bitmap}
|
78
|
+
asserts("Is a bitmap") {topic.class.to_s == "OSX::NSBitmapImageRep"}
|
79
|
+
end
|
80
|
+
|
81
|
+
context '.to_cgimage' do
|
82
|
+
setup {topic.to_cgimage}
|
83
|
+
asserts("Is a cgimage") {topic.class.to_s == "OSX::NSObject"}
|
84
|
+
end
|
85
|
+
|
86
|
+
context '.to_nsimage' do
|
87
|
+
setup {topic.to_nsimage}
|
88
|
+
asserts("Is a nsimage") {topic.class.to_s == "OSX::NSImage"}
|
89
|
+
end
|
90
|
+
|
91
|
+
context '.size' do
|
92
|
+
asserts("Size equals 50x50") {topic.size == {:width => 50, :height => 50}}
|
93
|
+
end
|
94
|
+
|
95
|
+
context '.size_to_fit_maximum(350)' do
|
96
|
+
asserts("Returns 350x350 ratio of 7.0") {topic.size_to_fit_maximum(350) == {:height=>350, :width=>350, :ratio=>7.0}}
|
97
|
+
end
|
98
|
+
|
99
|
+
context '.revert' do
|
100
|
+
asserts("Image reverts to original") {topic.ciimage = topic.flip_horizontally.revert.ciimage}
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: core_image
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Spencer Rogers
|
@@ -15,10 +15,37 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
18
|
+
date: 2012-01-31 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rubygems
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: riot
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
22
49
|
description: Simple image manipulation using Apple's Core Image technology. Scale, rotate, flip, convert, overlay, and more.
|
23
50
|
email: SpencerRogers@gmail.com
|
24
51
|
executables: []
|
@@ -28,9 +55,18 @@ extensions: []
|
|
28
55
|
extra_rdoc_files: []
|
29
56
|
|
30
57
|
files:
|
58
|
+
- .gitignore
|
59
|
+
- LICENSE
|
60
|
+
- README.md
|
61
|
+
- Rakefile
|
62
|
+
- core_image.gemspec
|
31
63
|
- lib/core_image.rb
|
64
|
+
- test/core_image_test.rb
|
65
|
+
- test/images/overlay.png
|
66
|
+
- test/images/test.pdf
|
67
|
+
- test/images/test.png
|
32
68
|
has_rdoc: true
|
33
|
-
homepage: https://github.com/serogers
|
69
|
+
homepage: https://github.com/serogers/core_image
|
34
70
|
licenses: []
|
35
71
|
|
36
72
|
post_install_message:
|
@@ -62,6 +98,6 @@ rubyforge_project:
|
|
62
98
|
rubygems_version: 1.5.3
|
63
99
|
signing_key:
|
64
100
|
specification_version: 3
|
65
|
-
summary: Manipulate images via Apple's Core Image technology
|
66
|
-
test_files:
|
67
|
-
|
101
|
+
summary: Manipulate images via Apple's built-in Core Image technology
|
102
|
+
test_files:
|
103
|
+
- test/core_image_test.rb
|