Armadilloフォーラム

armadillo-440の画像表示

kagawalab_yokota

2017年6月6日 16時18分

お世話になります。武中と申します。
armadillo-440にてタッチパネル液晶への画像表示及び動画再生を行っています。
画像表示は以下のページを参考にできたのですが、pngとjpegの扱いの違いがあまりわかっておりません。
https://users.atmark-techno.com/blog/615/1748

調べたところjpegでの表示はできない(またはpngの方が適している)ということでしたが理由がわかりません。
この違いを把握してから動画再生へと進みたいと考えているのでもしpngのほうがjpegよりarmadillo-440の液晶表示に適している理由(またはjpegではできない理由)等ありましたらお教えいただきたいです。

コメント

at_ohsawa

2017年6月6日 18時12分

単に「そのblogのサンプル」がcairoのライブラリ関数
cairo_image_surface_create_from_png() を使ってpngを
読み込んでいるだけで、Armadilloがjpegを表示できない
わけでは無いですよ。

jpegを読むならlibjpegで読むのも良いですし、
cairoでそのまま表示するだけならgdk_pixbuf_new_from_file()
あたりを使うのが簡単かと思います。

検索するとubuntuのフォーラムで丁度同じ事を実装している人が
いたので、参考にURLを貼っておきます。

https://ubuntuforums.org/showthread.php?t=1604747

at_hanada

2017年6月6日 22時43分

花田です。補足的に

> pngとjpegの扱いの違いがあまりわかっておりません。

こちらへの参考情報を。

png jpegに特徴・メリット・デメリットなどを組み合わせて検索すると大量にページが見つかると思いますが、こうした実装を行う上で知っておいた方がいい内容は下記のページあたりでしょうか(あくまでググって見つけたページの一つです)

BMP,JPG,GIF,PNG 画像フォーマットの違いを歴史的背景から解説 - 道すがら講堂
http://michisugara.jp/archives/2012/img_format.html

一通りさらっと読まれるとよいと思いますが、重要なのは下記の辺り。

JPEG
> 非可逆圧縮のため、圧縮後元の画像には戻せない。
> 圧縮率を指定できる。高いとデータ容量が少なくなり、低いと多くなる。
> 24bitフルカラーまでサポート。(最大ビット深度は24bit)(16,777,216色)
> 透過は不可。
写真のような画像(多色&高解像度)を、人の目にわかりにくいところを胡麻化して(劣化させて)でもファイルサイズを小さくすることを目的としているため、このような仕様です。

PNG
> 可逆圧縮の画像フォーマットのため、圧縮による画質劣化がない。
> 8bitまでのインデックスカラーモードをサポート。
> 透過属性「アルファチャンネル」「透過色」をサポート。(8bitから16bitの透過)
> プログレッシブ対応。
ロゴ(サイズは画面に比して小さい)を美しく(劣化なく)画面に合成するといったことを目的に含むため、このような仕様です。

cairoは、複数のプレーンや図形・文字を合成して一枚の絵にするソフトウェアとして開発されました。そのため、pngの方だけが対象になっていたわけです。

> pngのほうがjpegよりarmadillo-440の液晶表示に適している理由

「cairoが」ではなく「Armadillo-440が」がjpegに不向きな点が一つありまして。別のスレッドでも話題になっていた、浮動小数点演算機能の有無に関係します。

先ほどのページ、JPEGの解説にこんな箇所があります。

> カットのアルゴリズムも、今までのような単純なものではなく「量子化」「エントロピー符号化」などの高度な技術を使って圧縮しています。

アルゴリズム上、画像を空間サンプリングして量子化したり符号化する際に浮動小数点で扱います。PCや、ARMでもCortex-Aシリーズなどには浮動小数点演算機能があるため、JPEGコーデックに浮動小数点演算が必要であってもクロックなりの速度で動作します。
しかしArmadillo-400シリーズのARM9には浮動小数点演算がないので、この演算をソフトウェアでエミュレートすることになります。このオーバーヘッドがあるため、同機能を持つ近い性能のCPUに比べて数倍~十数倍の実行時間がかかってしまう(Armadillo-440だけの話でいえば、pngに比べると相当に遅い処理になる)ということが弱点になります。
(念のため…ソフトウェアエミュレートであっても遅いというだけでデコードは可能ですし、当然ながら演算結果や精度に違いはありません)

kagawalab_yokota

2017年6月7日 13時59分

ご回答ありがとうございます。武中です。
参考ページの添付ありがとうございます。自分でも探していて特徴はある程度理解していたのですが、まとめてくださることでより理解を深めることができました。
> 「cairoが」ではなく「Armadillo-440が」がjpegに不向きな点が一つありまして。別のスレッドでも話題になっていた、浮動小数点演算機能の有無に関係します。
> アルゴリズム上、画像を空間サンプリングして量子化したり符号化する際に浮動小数点で扱います。PCや、ARMでもCortex-Aシリーズなどには浮動小数点演算機能があるため、JPEGコーデックに浮動小数点演算が必要であってもクロックなりの速度で動作します。
> しかしArmadillo-400シリーズのARM9には浮動小数点演算がないので、この演算をソフトウェアでエミュレートすることになります。このオーバーヘッドがあるため、同機能を持つ近い性能のCPUに比べて数倍~十数倍の実行時間がかかってしまう(Armadillo-440だけの話でいえば、pngに比べると相当に遅い処理になる)ということが弱点になります。
> (念のため…ソフトウェアエミュレートであっても遅いというだけでデコードは可能ですし、当然ながら演算結果や精度に違いはありません)

jpgとpngの形式で処理を行う時、アルゴリズムやプロセッサのレベルで大きな違いがあることが理解できました。
実際に調べたところArmadillo-400シリーズのARM9には浮動小数点演算がないという記事を見つけることができました。
Armadillo-400シリーズが不向きだったということなんですね、他にもpngはlinux標準であるという記事もあったためpngで画像表示は行っていこうと思います。

ありがとうございました。今後ともよろしくお願いいたします。