【问题标题】:Retrieve content_type and file name from Base64 encoded image string in Rails 4?从 Rails 4 中的 Base64 编码图像字符串中检索 content_type 和文件名?
【发布时间】:2015-11-16 16:21:06
【问题描述】:

jpeg 图像被解码成一个字符串保存在uploaded_io:

uploaded_io = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2....."

在 rails 4 应用程序中,image magick 库已经安装,gem mini_magickGemfile 中。从uploaded_io,我们需要检索内容类型、大小和文件名(无需调整图像大小和操作)。我们尝试在控制器中使用 Ruby 的 base64 模块,但没有成功(错误且 decoded64 返回的不是图像文件):

require 'base64'

img = Base64.decode64(uploaded_io)
type = img.content_type #error
size = img.size  #error

有一个类似的post 。但是 ActiveSupport::Base64 在 Rails 4 中已停用,它不能应用于 Rails 4。

【问题讨论】:

  • 不要使用Base64.decode64解码uploaded_io,而应该尝试只解码data:image/jpeg;base64,之后的部分,换句话说,解码/9j/4AAQSkZJRgABAQAAAQABAAD/2.....
  • 我们做了img = Base64.decode64.read(uploaded_io.sub(/.+,/, '')) (字符串从/9j/4AA...开始)并且img被分配为{Module}URI .但是 img.content_type 返回 ''img.size 返回参数错误。我们还错过了什么?

标签: ruby ruby-on-rails-4 imagemagick base64


【解决方案1】:

不说 Ruby 或 Rails,我不太了解您的问题,但我认为您正在尝试获取有关 base64 编码图像的信息,我也许可以提供帮助。恐怕我只能从命令行方面来找你,但希望你能用 Ruby 将它...

让我们创建一个小图像:

convert -size 50x50 xc:red xc:lime xc:blue +append image.gif

要使用 ImageMagick 获取有关图像的信息,您通常使用 IM 套件中的 identify 程序,如下所示:

identify -verbose image.gif

Image: image.gif
  Format: GIF (CompuServe graphics interchange format)
  Mime type: image/gif
  Class: PseudoClass
  Geometry: 150x50+0+0
  Units: Undefined
  Type: Palette
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8/1-bit
  Channel depth:
    red: 1-bit
    green: 1-bit
    blue: 1-bit
  Channel statistics:
    Pixels: 7500
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
  Colors: 3
  Histogram:
      2500: (  0,  0,255) #0000FF blue
      2500: (  0,255,  0) #00FF00 lime
      2500: (255,  0,  0) #FF0000 red
  Colormap entries: 4
  Colormap:
         0: (255,  0,  0) #FF0000 red
         1: (  0,255,  0) #00FF00 lime
         2: (  0,  0,255) #0000FF blue
         3: (  0,  0,  0) #000000 black
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: red
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 150x50+0+0
  Dispose: Undefined
  Compression: LZW
  Orientation: Undefined
  Properties:
    date:create: 2015-11-17T10:07:39+00:00
    date:modify: 2015-11-17T10:07:39+00:00
    signature: 48d1b973cce66f9a19f3b3738773a30f0519438d893cdfff2223e1941589e008
  Artifacts:
    filename: image.gif
    verbose: true
  Tainted: False
  Filesize: 325B
  Number pixels: 7.5K
  Pixels per second: 7.5EB
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.9.2-6 Q16 x86_64 2015-11-15 http://www.imagemagick.org

如果我想对它进行 base64 编码,我会像这样使用openssl

openssl enc -base64 -in image.gif

R0lGODlhlgAyAPEAAP8AAAD/AAAA/wAAACH5BAAAAAAALAAAAACWADIAAAL+hI+p
y50Bo5y02juF3rz7D4adQ5YmgqXqKonuC3PnTD/sjbfxzsv1f8oJb73iDogkDZcp
o9OVjC6Y1Mrz+pFqD9VuBAvebLdebzg81pa7Z3Bauq62se9onDq/1pN3Zv65h9S3
9OcUCDQ4VGh0+JMotFjUWPOYE9kzSVOJc8mTObNJ1BnzGRS6MkpaWnKKmvqyytra
9AoV6zBLWxtyi5t7sSvS2/ALHAwyzFBscYycrLBs1ezxDB2dMT1SjXKtky22zdX9
9Q0eDjBOXi5wbpAOsa7Rjv4ez97+HmA/n7+PXx+PH8B1AtP5O9cv4D+DChEOLFdw
3MFwCQkulNiQ4sMXbxG7TdxWEeJFjxlBbszW8drHaiG/FQAAOw==

我的帖子的重点是表明您可以将 base64 混乱输入identify 进行解释,如下所示:

identify -verbose "data:image/gif;base64,R0lGODlhlgAyAPEAAP8AAAD/AAAA/wAAACH5BAAAAAAALAAAAACWADIAAAL+hI+p
> y50Bo5y02juF3rz7D4adQ5YmgqXqKonuC3PnTD/sjbfxzsv1f8oJb73iDogkDZcp
> o9OVjC6Y1Mrz+pFqD9VuBAvebLdebzg81pa7Z3Bauq62se9onDq/1pN3Zv65h9S3
> 9OcUCDQ4VGh0+JMotFjUWPOYE9kzSVOJc8mTObNJ1BnzGRS6MkpaWnKKmvqyytra
> 9AoV6zBLWxtyi5t7sSvS2/ALHAwyzFBscYycrLBs1ezxDB2dMT1SjXKtky22zdX9
> 9Q0eDjBOXi5wbpAOsa7Rjv4ez97+HmA/n7+PXx+PH8B1AtP5O9cv4D+DChEOLFdw
> 3MFwCQkulNiQ4sMXbxG7TdxWEeJFjxlBbszW8drHaiG/FQAAOw=="
Image:
  Base filename: FQAAOw==
  Format: GIF (CompuServe graphics interchange format)
  Mime type: image/gif
  Class: PseudoClass
  Geometry: 150x50+0+0
  Units: Undefined
  Type: Palette
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8/1-bit
  Channel depth:
    red: 1-bit
    green: 1-bit
    blue: 1-bit
  Channel statistics:
    Pixels: 7500
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 85 (0.333333)
      standard deviation: 120.208 (0.471405)
      kurtosis: -1.5
      skewness: 0.707107
      entropy: 0.918296
  Colors: 3
  Histogram:
      2500: (  0,  0,255) #0000FF blue
      2500: (  0,255,  0) #00FF00 lime
      2500: (255,  0,  0) #FF0000 red
  Colormap entries: 4
  Colormap:
         0: (255,  0,  0) #FF0000 red
         1: (  0,255,  0) #00FF00 lime
         2: (  0,  0,255) #0000FF blue
         3: (  0,  0,  0) #000000 black
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: red
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 150x50+0+0
  Dispose: Undefined
  Compression: LZW
  Orientation: Undefined
  Properties:
    date:create: 2015-11-17T10:12:05+00:00
    date:modify: 2015-11-17T10:12:05+00:00
    signature: 48d1b973cce66f9a19f3b3738773a30f0519438d893cdfff2223e1941589e008
  Artifacts:
    filename: data:image/gif;base64,R0lGODlhlgAyAPEAAP8AAAD/AAAA/wAAACH5BAAAAAAALAAAAACWADIAAAL+hI+p
y50Bo5y02juF3rz7D4adQ5YmgqXqKonuC3PnTD/sjbfxzsv1f8oJb73iDogkDZcp
o9OVjC6Y1Mrz+pFqD9VuBAvebLdebzg81pa7Z3Bauq62se9onDq/1pN3Zv65h9S3
9OcUCDQ4VGh0+JMotFjUWPOYE9kzSVOJc8mTObNJ1BnzGRS6MkpaWnKKmvqyytra
9AoV6zBLWxtyi5t7sSvS2/ALHAwyzFBscYycrLBs1ezxDB2dMT1SjXKtky22zdX9
9Q0eDjBOXi5wbpAOsa7Rjv4ez97+HmA/n7+PXx+PH8B1AtP5O9cv4D+DChEOLFdw
3MFwCQkulNiQ4sMXbxG7TdxWEeJFjxlBbszW8drHaiG/FQAAOw==
    verbose: true
  Tainted: False
  Filesize: 325B
  Number pixels: 7.5K
  Pixels per second: 7.5EB
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.9.2-6 Q16 x86_64 2015-11-15 http://www.imagemagick.org
  [1]: http://i.stack.imgur.com/j9Ei0.gif

或者,您可以使用 convert 并从其 base64 编码状态重新创建图像,如下所示:

{ echo "data:image/png;base64,"; openssl enc -base64 -in image.png; } | convert inline:- decoded.gif

【讨论】:

  • Mark Setchell,我想做的是将encoded64字符串保存回服务器上的jpeg文件(无需显示图像)。这似乎是您帖子的最后一步(我是 'IM. The echo` 的新手,似乎正在显示图像)。我不确定在保存之前是否需要基于编码的 64 字符串创建图像。有没有办法可以使用 Base64 处理编码的 64 字符串并将其直接保存为文件的原始格式 jpeg 格式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 2015-04-06
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多