4

私は基本的に、画像ファイルのヘッダーを読み込んで、実際にどのような種類のファイルであるかを簡単に比較しています。BMP、GIF、PNG は、ヘッダーにそれぞれ BM、GIF、PNG が含まれているため、簡単に識別できます。JPG は私にちょっとしたループを投げかけています。

jpg の最初の 3 バイトは 0xff\0xd8\0xff になる傾向があり、どのように設定しても単純な比較では真の値を得ることができません。

最初の 4 バイトを読みました。

if data[0, 3] == "\xff\xd8\xff"
    puts "This is a JPG"
end

私は近くにいることを知っていますが、それを機能させることができません。ここで見逃していることを教えてください。

注: これを行うための gem があることは知っていますが、gem を使用したくありません。そのような単純な。

4

4 に答える 4

0

ファイルの識別は、可能であれば他の人に任せるのが良い方法です。ruby-filemagic gem がこれを行います。

gem 'ruby-filemagic'

使用中、文字列を返します。

require 'filemagic'

magic = FileMagic.new
p magic.file("/tmp/pic1.jpg")
# => "JPEG image data, JFIF standard 1.02"

返された文字列は、正規表現と照合できます。

case magic.file(path)
when /JPEG/
  # do JPEG stuff
when /GIF/
  # do GIF stuff
else
  # we don't recognize it
end

ruby-filemagic は、多数のファイル タイプを認識するlibmagicライブラリを使用します。

ドキュメントは少しまばらで (README には "hello world" の例すらありません)、数年間更新されていませんが、試してみることを思いとどまらせてはいけません。使用するのは簡単で、かなりしっかりしています。今日、それを使用して製品コードを取得しましたが、それでも問題なく動作します。

何らかの理由で gem を使用できないが、*nix 環境にあり、「file」コマンドにアクセスできる場合は、「file」にシェルアウトすることで同じ機能を得ることができます。

p `file /tmp/pic1.jpg`
# => "/tmp/pic1.jpg: JPEG image data, JFIF standard 1.02\n

Debian では、fileコマンドは package fileによって提供されます。お使いの OS が異なる場合があります。

于 2013-05-29T14:37:13.400 に答える
0

次のように、ファイル情報を文字コードと比較できるはずです。

if data[0, 3] == 0xff.chr + 0xd8.chr + 0xff.chr
  puts "This is a JPG"
end

行き詰まった場合は、いつでも fastimage gem のコードを覗くことができます。型検出コードは次の場所にあります: https://github.com/sdsykes/fastimage/blob/master/lib/fastimage.rb#L337-L354

他の人 (@Stefan) が言及したように、エンコーディングが異なるため、元の例では文字列が一致しませんでした。

# Check the encodings for our strings:
"\xff\xd8\xff".encoding                   #=> <Encoding:UTF-8>
(0xff.chr + 0xd8.chr + 0xff.chr).encoding #=> <Encoding:ASCII-8BIT>

# Compare our two strings with different encodings:
utf8  = "\xff\xd8\xff"
ascii = 0xff.chr + 0xd8.chr + 0xff.chr

utf8 == ascii                              #=> false
utf8.force_encoding("ASCII-8BIT") == ascii #=> true

エンコーディングを ASCII-8BIT に強制した場合、元のコードは実際には正常に機能していたはずです。

于 2013-05-29T13:38:06.963 に答える
0

Data が文字列の場合、コードは正常に機能しますが、 Data はおそらくバイト値の配列です。

これを試して:

if data[0,3] == [0xff, 0xd8, 0xff]

あなたの条件として。

于 2013-05-29T13:37:26.400 に答える