Class: FastImage

Inherits:
Object
  • Object
show all
Includes:
FastImageParsing
Defined in:
lib/fastimage/version.rb,
lib/fastimage/fastimage.rb

Defined Under Namespace

Classes: BadImageURI, CannotParseImage, FastImageException, ImageFetchFailure, SizeNotFound, UnknownImageType

Constant Summary collapse

VERSION =
'2.4.0'
DefaultTimeout =
2
LocalFileChunkSize =
256
SUPPORTED_IMAGE_TYPES =
Parsers.keys.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from FastImageParsing

#parse_size_for_jxl

Constructor Details

#initialize(uri, options = {}) ⇒ FastImage

Returns a new instance of FastImage.



185
186
187
188
189
190
191
192
193
# File 'lib/fastimage/fastimage.rb', line 185

def initialize(uri, options={})
  @uri = uri
  @options = {
    :timeout          => DefaultTimeout,
    :raise_on_failure => false,
    :proxy            => nil,
    :http_header      => {}
  }.merge(options)
end

Instance Attribute Details

#bytes_readObject (readonly)

Returns the value of attribute bytes_read.



25
26
27
# File 'lib/fastimage/fastimage.rb', line 25

def bytes_read
  @bytes_read
end

Class Method Details

.animated?(uri, options = {}) ⇒ Boolean

Returns a boolean value indicating the image is animated. It will return nil if the image could not be fetched, or if the image type was not recognised.

By default there is a timeout of 2 seconds for opening and reading from a remote server. This can be changed by passing a :timeout => number_of_seconds in the options.

If you wish FastImage to raise if it cannot find the type of the image for any reason, then pass :raise_on_failure => true in the options.

Example

require 'fastimage'

FastImage.animated?("test/fixtures/test.gif")
=> false
FastImage.animated?("test/fixtures/animated.gif")
=> true

Supported options

:timeout

Overrides the default timeout of 2 seconds. Applies both to reading from and opening the http connection.

:raise_on_failure

If set to true causes an exception to be raised if the image type cannot be found for any reason.

Returns:

  • (Boolean)


181
182
183
# File 'lib/fastimage/fastimage.rb', line 181

def self.animated?(uri, options={})
  new(uri, options).animated
end

.size(uri, options = {}) ⇒ Object

Returns an array containing the width and height of the image. It will return nil if the image could not be fetched, or if the image type was not recognised.

By default there is a timeout of 2 seconds for opening and reading from a remote server. This can be changed by passing a :timeout => number_of_seconds in the options.

If you wish FastImage to raise if it cannot size the image for any reason, then pass :raise_on_failure => true in the options.

FastImage knows about GIF, JPEG, BMP, TIFF, ICO, CUR, PNG, HEIC/HEIF, AVIF, PSD, SVG, WEBP and JXL files.

Example

require 'fastimage'

FastImage.size("https://switchstep.com/images/ios.gif")
=> [196, 283]
FastImage.size("http://switchstep.com/images/ss_logo.png")
=> [300, 300]
FastImage.size("https://upload.wikimedia.org/wikipedia/commons/0/09/Jpeg_thumb_artifacts_test.jpg")
=> [1280, 800]
FastImage.size("https://eeweb.engineering.nyu.edu/~yao/EL5123/image/lena_gray.bmp")
=> [512, 512]
FastImage.size("test/fixtures/test.jpg")
=> [882, 470]
FastImage.size("http://switchstep.com/does_not_exist")
=> nil
FastImage.size("http://switchstep.com/does_not_exist", :raise_on_failure=>true)
=> raises FastImage::ImageFetchFailure
FastImage.size("http://switchstep.com/images/favicon.ico", :raise_on_failure=>true)
=> [16, 16]
FastImage.size("http://switchstep.com/foo.ics", :raise_on_failure=>true)
=> raises FastImage::UnknownImageType
FastImage.size("http://switchstep.com/images/favicon.ico", :raise_on_failure=>true, :timeout=>0.01)
=> raises FastImage::ImageFetchFailure
FastImage.size("http://switchstep.com/images/faulty.jpg", :raise_on_failure=>true)
=> raises FastImage::SizeNotFound

Supported options

:timeout

Overrides the default timeout of 2 seconds. Applies both to reading from and opening the http connection.

:raise_on_failure

If set to true causes an exception to be raised if the image size cannot be found for any reason.



111
112
113
# File 'lib/fastimage/fastimage.rb', line 111

def self.size(uri, options={})
  new(uri, options).size
end

.type(uri, options = {}) ⇒ Object

Returns an symbol indicating the image type fetched from a uri. It will return nil if the image could not be fetched, or if the image type was not recognised.

By default there is a timeout of 2 seconds for opening and reading from a remote server. This can be changed by passing a :timeout => number_of_seconds in the options.

If you wish FastImage to raise if it cannot find the type of the image for any reason, then pass :raise_on_failure => true in the options.

Example

require 'fastimage'

FastImage.type("https://switchstep.com/images/ios.gif")
=> :gif
FastImage.type("http://switchstep.com/images/ss_logo.png")
=> :png
FastImage.type("https://upload.wikimedia.org/wikipedia/commons/0/09/Jpeg_thumb_artifacts_test.jpg")
=> :jpeg
FastImage.type("https://eeweb.engineering.nyu.edu/~yao/EL5123/image/lena_gray.bmp")
=> :bmp
FastImage.type("test/fixtures/test.jpg")
=> :jpeg
FastImage.type("http://switchstep.com/does_not_exist")
=> nil
File.open("/some/local/file.gif", "r") {|io| FastImage.type(io)}
=> :gif
FastImage.type("test/fixtures/test.tiff")
=> :tiff
FastImage.type("test/fixtures/test.psd")
=> :psd

Supported options

:timeout

Overrides the default timeout of 2 seconds. Applies both to reading from and opening the http connection.

:raise_on_failure

If set to true causes an exception to be raised if the image type cannot be found for any reason.



153
154
155
# File 'lib/fastimage/fastimage.rb', line 153

def self.type(uri, options={})
  new(uri, options).type
end

Instance Method Details

#animatedObject



226
227
228
229
230
# File 'lib/fastimage/fastimage.rb', line 226

def animated
  @property = :animated
  fetch unless defined?(@animated)
  @animated
end

#content_lengthObject



232
233
234
235
236
# File 'lib/fastimage/fastimage.rb', line 232

def content_length
  @property = :content_length
  fetch unless defined?(@content_length)
  @content_length
end

#fetchObject

find an appropriate method to fetch the image according to the passed parameter



239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'lib/fastimage/fastimage.rb', line 239

def fetch
  raise BadImageURI if @uri.nil?

  if @uri.respond_to?(:read)
    fetch_using_read(@uri)
  elsif @uri.start_with?('data:')
    fetch_using_base64(@uri)
  else
    begin
      @parsed_uri = URI.parse(@uri)
    rescue URI::InvalidURIError
      fetch_using_file_open
    else
      if @parsed_uri.scheme == "http" || @parsed_uri.scheme == "https"
        fetch_using_http
      else
        fetch_using_file_open
      end
    end
  end

  raise SizeNotFound if @options[:raise_on_failure] && @property == :size && !@size

rescue Timeout::Error, SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET,
  Errno::ENETUNREACH, ImageFetchFailure, Net::HTTPBadResponse, EOFError, Errno::ENOENT,
  OpenSSL::SSL::SSLError
  raise ImageFetchFailure if @options[:raise_on_failure]
rescue UnknownImageType, BadImageURI, CannotParseImage
  raise if @options[:raise_on_failure]

ensure
  @uri.rewind if @uri.respond_to?(:rewind)

end

#heightObject



222
223
224
# File 'lib/fastimage/fastimage.rb', line 222

def height
  size && @size[1]
end

#orientationObject



213
214
215
216
# File 'lib/fastimage/fastimage.rb', line 213

def orientation
  size unless defined?(@size)
  @orientation ||= 1 if @size
end

#sizeObject

Raises:



201
202
203
204
205
206
207
208
209
210
211
# File 'lib/fastimage/fastimage.rb', line 201

def size
  @property = :size
  begin
    fetch unless defined?(@size)
  rescue CannotParseImage
  end

  raise SizeNotFound if @options[:raise_on_failure] && !@size

  @size
end

#typeObject



195
196
197
198
199
# File 'lib/fastimage/fastimage.rb', line 195

def type
  @property = :type
  fetch unless defined?(@type)
  @type
end

#widthObject



218
219
220
# File 'lib/fastimage/fastimage.rb', line 218

def width
  size && @size[0]
end