にbase64でエンコードされた画像データURIを保存し、私はこのオープンと私は見てきたいくつかの記事からルビー
x = Base64.decode64("data:image/png;base64,iVBOR....")
File.open('test.png','wb') {|file| file.write x}
をしようとしています。しかし、私は、ビューアで画像を開くことができない、私は何をする必要がありますもっと何か?
にbase64でエンコードされた画像データURIを保存し、私はこのオープンと私は見てきたいくつかの記事からルビー
x = Base64.decode64("data:image/png;base64,iVBOR....")
File.open('test.png','wb') {|file| file.write x}
をしようとしています。しかし、私は、ビューアで画像を開くことができない、私は何をする必要がありますもっと何か?
'data:image/png;base64,'
という接頭辞をBase64データとしてデコードしようとしています。その接頭辞は完全に有効なBase64データですが、PNGファイルのBase64表現ではありません。その結果、test.png
ファイルには、実際にはPNGファイルであるいくつかのナンセンスが含まれています。 PNGをデコードする前に、データのURL接頭辞を取り除く:
data_url = "data:image/png;base64,iVBOR...."
png = Base64.decode64(data_url['data:image/png;base64,'.length .. -1])
File.open('test.png', 'wb') { |f| f.write(png) }
どうやっていくつかのフォーマットを検出しますか?エンコードタイプ、ファイルフォーマット、イメージデータを取得するために 'data_url.match(/ data:(。*); base64、(。*)/)'を実行しましたが、文字列が大きいときにパフォーマンスの問題が発生する可能性があるかどうかはわかりません。 – juanpastas
@juanpastas:最初に正規表現を固定し、単純な文字列演算を使用して接頭辞を取り除きます。そして、MIMEタイプがどのように見えるかについてもう少し詳しく説明したいと思うかもしれません。 –
MIMEの種類私は以下のように処理しています:image/png、image/jpg – juanpastas
mu_is_too_shortの答えはかなり近いですが、それは、base64ストリームは、PNGデータが含まれていることを想定しています。私はbase64でテキストを持っている場合
base64で画像を開く方法について少しスクリプトだREGEXP = /\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m
data_uri_parts = data_url.match(REGEXP) || []
extension = MIME::Types[data_uri_parts[1]].first.preferred_extension
file_name = "myfilename.#{extension}"
File.open(file_name, 'wb') do |file|
file.write(Base64.decode64(data_uri_parts[2]))
end
は、vacio.txtはファイルです:私は、正しいファイル拡張子を確立するために、MIMEタイプライブラリを使用することをお勧めので、これは必ずしもそうではありません。
require 'base64'
entry="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE....."
File.open("vacio.txt","r") do |fichero|
while linea=fichero.gets
regex=/(data:image\/\D*\d*,)/
m=regex.match(linea)
png=Base64.decode64(linea[m.to_s.length .. -1])
File.open('test.jpeg','wb'){|f|f.write(png)}
end
end
代わりRegexp
を使用して、あなたも簡単なString#index方法を利用することができます。
はstr内の指定されたストリングまたはパターン(正規表現)の第検出された位置のインデックスを返します。見つからなければnilを返します。あなたは(はJavaScriptの
.toDataURL()
canvas
上のような)合理的に健全なデータソースを使用している場合、あなたは一般的なMIMEタイプにカンマが含まれていないという事実に頼ることができ
。
dataURL = "data:image/png;base64,iVBOR...."
start = dataURL.index(',') + 1 # .index used here
x = Base64.decode64 dataURL[start..-1]
File.open('test.png','wb') {|file| file.write x}
あなたは自由形式のユーザーのファイルアップロードで作業している場合は、いくつかの珍しいMIMEタイプをカンマ(例えば:text/x-java-source,java
)が含まれていませんことを注意してください。あなたはより保守的に使用することができます。
start = dataURL.index(';base64,') + 8
あなたは接頭辞をbase64やデータのURLをbase64を持っているかどうかがわからない場合、あなたはテストとして#index
を使用することができます。
start = dataURL.index ';base64,'
dataURL = dataURL[(start+8)..-1] if start
x = Base64.decode64 dataURL
恩赦私の侵入を:念のためbase64.strict_encode64(File.read( "test.png")) ' - carry()は、Rubyのbase64 PNG * encode * onelinerを探しています。に。 :) –