エクセル内の画像

エクセルバカ相手の低レベルな「ごっこネタ1)」であるが、エクセルバカには猫に小判、豚に真珠であるが、バカは「バイナリ」という語が大好きである(笑)。いい客引きになる(爆)。
NOTES
1) エクセルバカが能もないのにやりたがる「バイナリごっこ」「文字コードごっこ」「UTF-8ごっこ」「改行ごっこ」「エンディアンごっこ」「16進数ごっこ」「CSVごっこ」「暗号化ごっこ」などを総称したもの。小学校程度のアタマしかない者が微分方程式を解こうとするのに似ている。

単なる普通の画像の取り出しにすぎないものだが、「バイナリ」という言葉はエクセルバカが大好きなのでそれを使っただけである。もちろん、このような「バイナリ」という語の使い方はエクセルバカが使うような無意味な使い方で、世間一般人には通じない。エクセルバカ用語である(笑)。

これを書く動機になったのは次のような検索があったからである。自分からはこんな無意味なことはやる気も起こらない(笑)。
LOG
126.161.8.188 [14/Jul/2017:14:37:36] Excel 画像テータをバイナリ
さすがエクセルバカ。
210.128.183.1 [09/Sep/2015:09:52:03] c# excel 画像取得
126.186.56.70 [07/Mar/2014:15:06:35] Excel c# com 画像ファイル
210.196.160.244 [29/Mar/2013:15:02:49] C# 遅延バインド Excelの画像を取り出す
114.158.17.175 [12/Dec/2014:15:03:58] エクセル 写真貼り付け バインド
これはただの血迷ったエクセルバカである。
検索エンジンから飛んでくる者が「C#」と書いていても、その実態はC#などは知らないエクセルバカである。これもエクセルバカの発想である。無関係な語を意味も知らずにベタベタと並べるのはエクセルバカの特徴である。


さて、次のようなJPG画像がある(sinozaki_ai.jpg)。サイズは13614バイトである。


この画像をエクセルに挿入して保存する(しのざきあい.xls)。
上と比べるといくぶん画像が大きくなったような気がするが、それはここでは問題ではない。


さて、この両者の16進ダンプを比べてみる。
  1. sinozaki_ai.jpgの場合。
  2. しのざきあい.xlsの場合。
エクセルファイルの中にはほぼそのままの形で元の画像ファイルが入っていることがわかる。
具体的には、「しのざきあい.xls」の2264バイト目から「sinozaki_ai.jpg」のデータの先頭の「FF D8 FF E0 00 10 4A 46 49 46」がみえる。
そこから約13614バイトほどは同じデータが続いている。



さてここで、このエクセルファイルの2264バイト目から13614バイトを取り出して、これを「篠崎愛.jpg」としてファイルに保存してみよう。
このソース(sinozaki_ai.cpp)はここ。


さて、取り出した画像を見てみると、元の画像とはかなり違っている。
左が元の画像、右がいま取り出した画像である。


この原因はどこにあるのか。
「篠崎愛.jpg」を16進ダンプして元の画像の「sinazaki_ai.pg」のものと比べてみる。
ダンプの406行目あたりに、元の画像にはない4バイトの「3C 00 B5 15」が埋め込まれていることがわかる。
ちなみに、この4バイトはWindows 8.*のExcel2013には埋め込まれていないようである。

そこで、今度はもっと正確にエクセルファイルの2264バイト目から13618バイトを取り出して、これを「篠崎愛.jpg」としてファイルに保存する(はじめは13614バイトだった点に注意)。

さてこのようにして取り出してみても、やはり画像は同じだった。途中の4バイトを取り去ったわけではないからこれは当然である。この4バイトを飛ばして取り出せば元通り再現されるだろう

この4バイトはエクセル内部だけで使われる何かの識別マークかもしれない(正体不明)。または、エクセル内部ではこれを無視するようになっているのかもしれない(推測)。その実際のところはわからない。

この実験から、C言語などのプログラムで、エクセルのファイルから無理やりにあるバイト数を取り出すことはあまり意味がないということがわかる。

重要
エクセルのことはエクセル内で処理するのが一番よい。

この場合でいえば、シートで画像を右クリックし、そこで出たメニューでコピーし、ペイントまたは画像ソフトに貼り付けて、そこでファイルに保存すれば画像は簡単に取り出せる。

- 2013/03/29 -



画像取り出し再試行

さて、改悪退化OSであるWindows 8にもちょっと慣れてきたので、懸案であった「この4バイトを飛ばして取り出せば元通り再現されるだろう」という予想が当たっているかどうか確認してみた。
これは当たっていたようである。このソース(s_ai2.cpp)はここ。

まず問題の「3C 00 B5 15」という4バイトの位置を確認する。Excelのバージョンが変れば当然こういうものも変るのは常識である。この検索にはバイナリ・サーチ・ツール(ipc_0070)を使えばよい(下図)。


これは10371バイト目から10374バイト目の間にあることがわかる。



したがって、その位置のバイトをスキップしてデータを取り出せばよいわけである。


これで元通りの画像が取り出せたというわけである。

この問題は、次のようなパターンに定式化できる。

要点
何かのファイルがある。
そのファイルの a バイト目から s バイトを取り出したい。
ただし、b バイト目から c バイト目までは除外したい。

a,b,c,sの値さえわかればあとは自動的に取り出せることになる。これを定式化したソースはここを参照。この場合、ftell関数を使わない場合(s_ai3.cpp)と使う場合(s_ai4.cpp)の2通りの方法がある。ftellを使う方がやや簡明か。
なお、これが複雑になっても考え方は同じである。



特別レポート

Excel VBAでの画像の取り出しの例である。
こんなものを見ているのは全部が能のないエクセルバカだから、エクセルそのものでの実行例も出しておこう。
上と同じ考えをエクセルで実行しただけのことである。正常に画像が取り出せていることがわかる。

それにしても、BASICというのはプログラミングのスキルアップには何の役にも立たないが、バカでも簡単に扱えるようにはなっている点が唯一の取り柄である。

Byte1.xlsmにこの実行マクロがある。


画像の取り出しの実行。


これから開始。


画像の取り出し終了。


確かに「篠崎愛_vba.jpg」ができている。


正常な画像になっているかどうか確認する。正常である。



タコの殿堂
篠崎愛オタクが珍しくまともなことを書いたわねぇ。酔っ払ってんじゃないの。エクセルバカにバイナリなんて「ネコに小判」よ。
篠崎愛でプログラミング」なんてのを作って、エクセルバカの大好きな「ごっこネタ」をやったらどう(笑)。