クロスプラットフォームの画像ファイルサイズは同じですか?

クロスプラットフォームの画像ファイルサイズは同じですか?

私のアプリケーションは、*.png 画像ファイルの正確なファイル サイズ (バイト) を知る必要があります。これは Linux 上で期待どおりに動作します。

% !TeX TS-program = lualatex
% !TeX encoding = UTF-8
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\usepackage{mwe}
\usepackage{graphics}
\gdef\getfilesize#1{%
  \directlua{
    local filename = ("\luaescapestring{#1}")
    local foundfile = kpse.find_file(filename, "tex", true)
    if foundfile then
      local size = lfs.attributes(foundfile, "size")
      if size then
        tex.write(size)
      end
    end
  }%
}
\begin{document}
\includegraphics{example-image-4x3.png}\par
Above file size: \getfilesize{example-image-4x3.png}\par
\end{document}

ファイル サイズは 1247 と報告されていますが、これは正しいです。残念ながら、他のオペレーティング システム (Windows、Mac) にはアクセスできません。この方法は、他のオペレーティング システムでも機能しますか? 報告される値は、異なるシステムでも同じでしょうか?

編集: つまり、この質問を見て Windows (MiKtex) を使用している方の中で、上記のコードは Linux で取得したものと同じ数値を報告しているでしょうか? PDF に印刷されています。同じであるはずですが、確認したいのです。

なぜこれを行うか: 画像の使用は制限されています。画像が「途中で誰かが編集した」ものではなく、「以前に承認されたものと同じ」ものであることを確認するために、ファイル サイズなど、いくつかのチェックが行われます。

答え1

はシステムコールに従ってlfs.attributes()使用するstat()その文書Linux、macOS、Windows、およびPOSIX標準によるサイズは、ファイルの実際のサイズです (シンボリック リンクが解決された後)。したがって、この方法を使用してファイル サイズを取得するのは安全です。この方法が十分に安全ではないと思われる場合は、seek を使用してファイル サイズを取得するために lua で使用される一般的な方法を使用できます。私が投稿した他の回答を参照してください。

答え2

一般的に、lfs.attributes()クロスプラットフォームで動作することが信頼できます。 遅いですが確実に動作する代替手段:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
%\usepackage{mwe}
\usepackage{graphics}
\gdef\getfilesize#1{%
  \directlua{
    function fsize (file)
      local h = io.open(file)
      local size = h:seek("end")
      assert(h:close())
      return size
    end
    local filename = ("\luaescapestring{#1}")
    local foundfile = kpse.find_file(filename, "tex", true)
    if foundfile then
      local size = fsize(foundfile)
      if size then
        tex.write(size)
      end
    end
  }%
}
\begin{document}
\includegraphics{example-image-4x3.png}\par
Above file size: \getfilesize{example-image-4x3.png}\par
\end{document}

変更元: https://www.lua.org/pil/21.3.html

関連情報