I'm using the following code to get the width of image using Dimensions Gem.
file_path = "http://localhost:3000/uploads/resize/avatar/25/ch05.jpg"
width = Dimensions.width(open(file_path).read)
When I put the image url in url bar it renders the image in browser. what I'm trying to do is to get the width of image. so can anyone know what I'm doing wrong?
So your issue is that Dimensions requires a file path to determine the width of the image. open will return a StringIO and open(...).read will return a String both will fail when using File.open.
Dimensions#width 
def width(path)
  io_for(path).width
end
Dimensions#io_for 
def io_for(path)
  Dimensions(File.open(path, "rb")).tap do |io|
    io.read
    io.close
  end
end
To work around this you can download the image to a Tempfile and then use that path to pass to Dimensions.width like so 
 path = "http://localhost:3000/uploads/resize/avatar/25/ch05.jpg"
 t = Tempfile.new                 # you could add a name but it doesn't matter
 t.write(open(path).read)         # write the image to the Tempfile
 t.close                          # must close the file before reading it
 width = Dimensions.width(t.path) # pass the Tempfile path to Dimensions
 t.unlink                         # deletes the Tempfile 
We can make this look a little cleaner like so:
def get_width_of_url_image(url)
  t = Tempfile.new.tap do |f| 
    f.write(open(url).read)
    f.close
  end
  width = Dimensions.width(t.path)
  t.unlink and width
end
get_width_of_url_image("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png")
#=> 272
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With