core_image 0.0.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.
- data/lib/core_image.rb +188 -0
- metadata +67 -0
data/lib/core_image.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
class CoreImage
|
2
|
+
require 'osx/cocoa'
|
3
|
+
|
4
|
+
# CORE IMAGE PROTOTYPE
|
5
|
+
# Created by Spencer Rogers on January 24, 2012
|
6
|
+
|
7
|
+
attr_accessor :image_path
|
8
|
+
attr_accessor :original_image
|
9
|
+
attr_accessor :ciimage
|
10
|
+
attr_accessor :bitmap
|
11
|
+
|
12
|
+
def initialize(object)
|
13
|
+
initialize_image(object)
|
14
|
+
end
|
15
|
+
|
16
|
+
def scale(ratio)
|
17
|
+
scaleFilter = OSX::CGAffineTransformMakeScale(ratio, ratio)
|
18
|
+
self.ciimage = self.ciimage.imageByApplyingTransform(scaleFilter)
|
19
|
+
self
|
20
|
+
end # scale
|
21
|
+
|
22
|
+
def rotate(degrees)
|
23
|
+
radians = degrees_to_radians(degrees)
|
24
|
+
transform = OSX::CGAffineTransformMakeRotation(radians)
|
25
|
+
self.ciimage = self.ciimage.imageByApplyingTransform(transform)
|
26
|
+
self
|
27
|
+
end # rotate
|
28
|
+
|
29
|
+
def flip_horizontal
|
30
|
+
transform = OSX::CGAffineTransformMakeScale(-1.0, 1.0)
|
31
|
+
self.ciimage = self.ciimage.imageByApplyingTransform(transform)
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def crop(x, y, w, h)
|
36
|
+
# coordinates start in lower left
|
37
|
+
self.ciimage = self.ciimage.imageByCroppingToRect(OSX::CGRectMake(x, y, w, h))
|
38
|
+
self
|
39
|
+
end # crop
|
40
|
+
|
41
|
+
def tint(x, y, w, h, rgb_string)
|
42
|
+
context = create_ci_context(w, h)
|
43
|
+
colored_image = OSX::CIImage.imageWithColor(OSX::CIColor.colorWithString(rgb_string))
|
44
|
+
filter = OSX::CIFilter.filterWithName("CIMultiplyCompositing")
|
45
|
+
filter.setValue_forKey(colored_image, "inputImage")
|
46
|
+
filter.setValue_forKey(self.ciimage, "inputBackgroundImage")
|
47
|
+
new_image = filter.valueForKey("outputImage")
|
48
|
+
new_image.drawAtPoint_fromRect_operation_fraction(OSX::NSMakePoint(x, y), OSX::NSRectFromCGRect(new_image.extent), OSX::NSCompositeCopy, 1.0)
|
49
|
+
self.ciimage = new_image
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def color_at(x, y)
|
54
|
+
to_bitmap.colorAtX_y(x, y) # returns NSColor
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_bitmap
|
58
|
+
OSX::NSBitmapImageRep.alloc.initWithCIImage(self.ciimage)
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_cgimage
|
62
|
+
to_bitmap.CGImage
|
63
|
+
end
|
64
|
+
|
65
|
+
def size
|
66
|
+
width, height = 0, 0
|
67
|
+
|
68
|
+
begin # sometimes ciimage.extent throws an error
|
69
|
+
size = self.image.extent.size
|
70
|
+
width = size.width
|
71
|
+
height = size.height
|
72
|
+
rescue
|
73
|
+
# if image.extent fails, use another method for measuring size (by converting to a cgimage)
|
74
|
+
begin
|
75
|
+
cgimage = self.to_cgimage
|
76
|
+
width = OSX::CGImageGetWidth(cgimage)
|
77
|
+
height = OSX::CGImageGetHeight(cgimage)
|
78
|
+
rescue # if the second image size function fails set zero
|
79
|
+
width = 0
|
80
|
+
height = 0
|
81
|
+
end # begin/rescue
|
82
|
+
end # begin/rescue
|
83
|
+
|
84
|
+
{:width => width, :height => height}
|
85
|
+
end
|
86
|
+
|
87
|
+
def revert
|
88
|
+
self.ciimage = self.original_image
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def save(save_to = self.image_path)
|
93
|
+
blob = to_bitmap.representationUsingType_properties(file_type(save_to), nil)
|
94
|
+
blob.writeToFile_atomically(save_to, false)
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def initialize_image(object)
|
100
|
+
|
101
|
+
case object.class.to_s
|
102
|
+
when "String"
|
103
|
+
self.image_path = object
|
104
|
+
if File.extname(object).downcase == ".pdf"
|
105
|
+
self.ciimage = open_from_pdf_path(object)
|
106
|
+
else
|
107
|
+
self.ciimage = open_from_path(object)
|
108
|
+
end
|
109
|
+
when "OSX::CIImage"
|
110
|
+
self.ciimage = object
|
111
|
+
end
|
112
|
+
|
113
|
+
if self.ciimage
|
114
|
+
self.original_image = self.ciimage
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def open_from_path(path_to_image)
|
119
|
+
OSX::CIImage.imageWithContentsOfURL(OSX::NSURL.fileURLWithPath(path_to_image))
|
120
|
+
end # open
|
121
|
+
|
122
|
+
def open_from_pdf_path(pdf_path, scale = 1, dpi = 72.0, preserve_alpha = false)
|
123
|
+
data = OSX::NSData.dataWithContentsOfURL(OSX::NSURL.fileURLWithPath(pdfPath))
|
124
|
+
pdf_rep = OSX::NSPDFImageRep.imageRepWithData(data)
|
125
|
+
nsimage = OSX::NSImage.alloc.initWithData(data)
|
126
|
+
nssize = nsimage.size
|
127
|
+
|
128
|
+
# calculate the width and height of the new image
|
129
|
+
width = (nssize.width.to_f * 200.0 * scale) / 72.0
|
130
|
+
height = (nssize.height.to_f * 200.0 * scale) / 72.0
|
131
|
+
|
132
|
+
# set the size of the new image
|
133
|
+
nssize = OSX::NSMakeSize(width, height)
|
134
|
+
context = create_ns_context(width, height)
|
135
|
+
context.setShouldAntialias(true)
|
136
|
+
|
137
|
+
# create a bounding rectangle to grab the contexts of the pdf
|
138
|
+
destination_rectangle = pdf_rep.bounds
|
139
|
+
destination_rectangle.size = nssize
|
140
|
+
|
141
|
+
OSX::NSRectFill(destination_rectangle) if preserve_alpha # defaults to black
|
142
|
+
|
143
|
+
# grab the contents of the rectangle from the pdf and store it in the graphics port
|
144
|
+
pdf_rep.drawInRect(destination_rectangle)
|
145
|
+
|
146
|
+
# grab the new image from the graphics port and convert to cgimage
|
147
|
+
cgimage = OSX::CGBitmapContextCreateImage(context.graphicsPort)
|
148
|
+
|
149
|
+
# return a ciimage
|
150
|
+
OSX::CIImage.initWithCGImage(cgimage)
|
151
|
+
end
|
152
|
+
|
153
|
+
def degrees_to_radians(degrees)
|
154
|
+
degrees.to_f * (Math::PI / 180.0)
|
155
|
+
end
|
156
|
+
|
157
|
+
def file_type(image_name)
|
158
|
+
return nil if image_name.nil?
|
159
|
+
|
160
|
+
case File.extname(image_name).downcase
|
161
|
+
when ".jpg", ".jpeg"
|
162
|
+
OSX::NSJPEGFileType
|
163
|
+
when ".png"
|
164
|
+
OSX::NSPNGFileType
|
165
|
+
when ".tiff", ".tif"
|
166
|
+
OSX::NSTIFFFileType
|
167
|
+
when ".gif"
|
168
|
+
OSX::NSGIFFileType
|
169
|
+
when ".pct"
|
170
|
+
OSX::NSPCTFileType
|
171
|
+
when ".bmp"
|
172
|
+
OSX::NSBMPFileType
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
def create_ci_context(width, height)
|
178
|
+
create_ns_context(width, height).CIContext
|
179
|
+
end
|
180
|
+
|
181
|
+
def create_ns_context(width, height)
|
182
|
+
bitmapRep = OSX::NSBitmapImageRep.alloc.initWithBitmapDataPlanes_pixelsWide_pixelsHigh_bitsPerSample_samplesPerPixel_hasAlpha_isPlanar_colorSpaceName_bytesPerRow_bitsPerPixel(nil, width, height, 8, 4, true, false, OSX::NSDeviceRGBColorSpace, 0, 0)
|
183
|
+
context = OSX::NSGraphicsContext.graphicsContextWithBitmapImageRep(bitmapRep)
|
184
|
+
OSX::NSGraphicsContext.setCurrentContext(context)
|
185
|
+
context
|
186
|
+
end # createContext
|
187
|
+
|
188
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: core_image
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Spencer Rogers
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-24 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: A gem to harness the power of Apple's Core Image technology that is built into Mac OS X. Scale, rotate, flip, convert, tint, and more!
|
23
|
+
email: SpencerRogers@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- lib/core_image.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: https://github.com/serogers
|
34
|
+
licenses: []
|
35
|
+
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 3
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
version: "0"
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
hash: 3
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
requirements:
|
60
|
+
- Mac OS X
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 1.5.3
|
63
|
+
signing_key:
|
64
|
+
specification_version: 3
|
65
|
+
summary: Manipulate images via Apple's Core Image technology
|
66
|
+
test_files: []
|
67
|
+
|