These pages are written by only Japanese.

Welcom to My Diary.com
最新の日記タイトル一覧カテゴリ別タイトル一覧トップへ戻る〜

おはようございます♪ 現在は3月29日(金)5時59分。 外が白んでくる時間です。


hns - 日記自動生成システム - Version 2.19.5 (色々 Fixed)

先月 2009年02月 来月
01 02 3 04 5 6 7
08 09 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Namazu for hns による簡易全文検索です。
詳細は 詳細指定/ヘルプをご参照下さい。
検索式:

2009年02月10日(火)

[swfed] GIF 画像入れ替え処理実装 (3)

夢の中でデバッグ終了。仮に getPNGData にバグがないとしたら、 0 byte の画像データが入っているんじゃないかという事で、 朝までコードを追ってました(夢の中で…)。
% php sample/swfdump.phps ~/tmp.swf
<略>
[169] tag=DefineBitsLossless2(36)  length=8
        image_id=69  format=3  width=84  height=188
<略>
正解!

palette 処理:

GIF から吸い出したパレットでない変数を参照していたと…

compress 処理:

既存の不具合を発見。
compress(tmp_buff, &compsize, old_buff_ref, old_size);
fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size");
XXX: compsize=0 old_size=16816
ここで compsize (圧縮後の値) が 0 になるので画像データが消えるのですが、
fprintf(stderr, "AAA: compsize=%lu old_size=%lu\n, compsize, old_size");
compress(tmp_buff, &compsize, old_buff_ref, old_size);
fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size");
AAA: compsize=0 old_size=16816
XXX: compsize=0 old_size=16816
あーーっっ。○rz
fprintf(stderr, "AAA: compsize=%lu old_size=%lu\n, compsize, old_size");
compress(tmp_buff, &compsize, old_buff_ref, old_size);
fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size");
圧縮後のデータの格納先 buff としてどの位確保したのかを 伝えないとダメでした。
compsize = old_size;
fprintf(stderr, "AAA: compsize=%lu old_size=%lu\n, compsize, old_size");
compress(tmp_buff, &compsize, old_buff_ref, old_size);
fprintf(stderr, "XXX: compsize=%lu old_size=%lu\n, compsize, old_size");
AAA: compsize=16816 old_size=16816
XXX: compsize=8543 old_size=1681
format = 5 では初期化してたけど format = 3 では忘れてたみたい。 format = 3 の動作確認もしてましたが、stack のゴミが入っていて たまたま動いていたようです。
-O0 もテストパターンに含めておきますかね… 成功!

2009年02月11日(水)

[swfed] swfed v0.15 release (GIF 対応)

以前から要望の多かった GIF 画像入れ替えに対応しました。

GIF 入れ替え:

↓ これで入れ替えられます。
replaceGIFData($image_id, $gif_data);
既存の PNG, Jpeg 入れ替えと同じインターフェースです。

不具合修正:

変数未初期化のバグを修正しました。
幸い脆弱性には繋がりません *1 が、 これが原因で画像入れ替え処理に失敗する事がありました。
罠を踏んでいる人がいたら、ほんとごめんなさい。
具体的には、失敗すると入れ替えたはずの画像のスペースが真っ赤になります。
Flash Player は画像データを認識できない場合、赤く塗りつぶすので。

画像入れ替えページ:

png か jpg かをボタンで指定するのが面倒という声を頂いたので、 ボタンを一つにまとめて、画像フォーマットの自動判定を行うようにしました。
function detect_image_ext(&$imagedata) {
    $image_sig = substr($imagedata, 0, 0x10);
    if (strpos($image_sig, 'JFIF') === 6) {
        $ext = '.jpg';
    } elseif (strpos($image_sig, 'PNG') === 1) {
        $ext = '.png';
    } elseif (strpos($image_sig, 'GIF') === 0) {
        $ext = '.gif';
    } else {
        $ext = false;
    }
    return $ext;
}
間違えてたらごめんなさい。(´Д`;)

制限事項:

テスト中に差し替えに失敗する GIF 画像を見つけました。
でも、IE でも表示できない(Firefox だと表示できる)画像でしたので、 対応は後回しにさせて下さい。

追記 (2009/04/07):

IE だけ表示できない GIF の件は、こちら↓

追記 (2010/12/06):


*1: と思っていたけど、 圧縮する事でサイズが(通常とは逆に)増えるパターンだと危ないかも… (zlib伸張後のフレームオフセットを合わせてとか器用な事って実際できるのかな)

2009年02月14日(土)

Yahoo!ニュースのID表示

これはひどいww それだけはやっちゃダメでしょw
あからさまな自作自演をバレてないと思って続けてたアホに 天罰が下った点で、個人的には GJだと思うけど (´ω`)

MFC で OpenGL

↑この本を何となく購入したので、さっそくプログラミングするかと思ったら、 フリーで使える 2008 Express Edition は MFC が使えませんでした。
* Visual C++ 2008 Express Edition には MFC と ATL は含まれていますか。 
いいえ。Visual C++ 2008 Express Edition には MFC と ATL は含まれていません。
MFC と ATL は Visual Studio 2008 Standard Edition 以上に含まれています。
昔、購入した Visual C++ 6.0 standard edition があったので、 こっちでコンパイル。
以下のような違いはあるけど何となく進められました。 といった感じで、青く塗りつぶすだけのサンプルプログラムが動作しました。

/* CDialog::OnPaint(); */
CPaintDC dc(this); // 描画用のデバイス コンテキスト
wglMakeCurrent(dc.GetSafeHdc(), m_hGLRC);
glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
wglMakeCurrent(NULL, NULL);
さて、開発環境は出来たので遊ぶとしますか。

誤植?:

先の本(p15 の一番下)には追加する lib ファイルとして open32gl.lib だったり open32.lib だったりと揺れてるけど、前者が正解。普通に分かるから別にいいけど。

2009年02月15日(日)

[swfed] 透明度付き画像の入れ替え不具合

swfed で SWF 内の画像を透明度付き PNG 画像で差し替えると おかしな色が混じる件ですが、仕様書の中に以下の記述を発見。
           BitmapPixelData ARGB[image data size]
Array of pixel colors.
Number of entries is BitmapWidth * BitmapHeight.
The RGB data must already be multiplied by the alpha channel value.
Flash CS3 とかで画像を放り込むと透明な場所の RGB 値に変化があったのは そういう事か…
予め alpha 値分減らして RGB 値を保存しておけば、 実行時の色の重ね合わせで処理を省けますしね。

問題の説明:

まとめると、以下のような感じ
  • 実行時の色の重ね合わせ処理を軽くする為、予め alpha 分 RGB 値を減らすのが本来の仕様。(計算式からの推測)
  • ところが、減らさずに PNG データの RGB 値をそのまま Lossless2 に埋め込んでいた。(不具合)
  • その為、色の重ね合わせで RGB 値が大きくなりすぎ 255 を超え、2 の補数でひっくり返って、ネガっぽい色が表示された。(前半は憶測)
  • ただし、alpha = 0 の時だけその色を足さない処理になっていて(憶測) そこだけ透明度が働いて輪郭の外側の背景が見えていた。 (なので alpha を 0 と 255 の2値表現で利用する場合は問題が発生しない *1 )
すっきり。(´∀`)

trunk に commit:

alpha 値(不透明度)が 0, 255 以外の時に表示される色がおかしくなる不具合を修正
- PNG の (R, G, B, A) を (R*A/255, G*A/255, B*A/255, A) に変換し Lossless2 タグに保存するように修正
- GIF は透明度 pixel を (0, 0, 0, 0) で保存するように修正

2009/12/10 追記:


*1: …と思ってたけど、微妙におかしいとの報告も貰っているので要研究。

2009年02月16日(月)

IE で GIF 画像が表示できない問題

とあるサイトで FireFox で表示できるのに IE だと表示できない GIF 画像を発見。

解析:

giflib を使って GIF ファイルの中を調べてみました。
Screen Infomation:
    (Width, Height)=(159, 45)  ColorResolution=8  BackGroundColor=0
ColorMapObject:
    ColorCount=128  BitsPerPixel=7
	<略>
ImageCount=1
# Image No. 0
ImageDesc
    (Left, Top)=(0, 0)  (Width, Height)=(159, 46)  Interlace=0
なるほど。

解説:

GIF は初めに Screen として表示サイズ(Width, Height)を設定します。
GIF は複数のイメージデータを含める事が出来て (GIF anime とか)、 各イメージで(Screenのどこに表示するかの) geometry (x,y-width,height)を 持ちますが、これが Screen の枠からはみ出ていると…
この位は許容してくれても良さそうですが、IE は厳しいようです。

修正:

修正するプログラムを作ってみました。 以下にようにして、画像ファイル(のスクリーンサイズ)を修正できます。
% gcc -o gif_fixscreen gif_fixscreen.c -lgif
% gif_fixscreen old.gif > new.gif

ImageMagick:

ちなみに ImageMagick だと以下のように Screen の方が大きなサイズ だと言われます。
% identify  414954_160.gif
414954_160.gif GIF 159x46 159x45+0+0 PseudoClass 128c 2.6kb
あれれ…
続く

追記1 (2010/02/01):

ImageMagick の GIFフォーマット解析ルーチンがバグってて Screen と Page を逆で拾ってるっぽい。うーんw

追記2 (2010/02/01):

JPEG でも IE だけ表示出来ない問題を見つけたので追記。
jpegを保存するときCKYKで保存するとIEでは表示できない

2009年02月17日(火)

mb_strlen() 関数の落とし穴

会社の同僚と mb_strlen の話をしていて以下のページを見つけましたが、
<?php
$str = '日本語にほんご';
var_dump(mb_strlen($str, 'SJIS'));
?>

というように、mb_strlen()関数の第2引数に$strの文字エンコードを指定すると、
 PHPの内部エンコーディング設定に関わらず正しく動作するようになります。
環境が変わったら突然おかしくなったということを防ぐためにも、
第2引数で文字エンコードを指定するようにすることをお勧めします。
うーんw
そもそも、環境の方を見直すべきじゃないかと思うのは自分だけだろうか…
場所によって文字コードがバラバラだったらアーキテクチャを見直すべきだし。

これで、6 日分だよ〜。

タイトル一覧
カテゴリ分類
Database
JXTA
Java
XML
awm
bookmark
keyword
memo
news
research
Powered by hns-2.19.5, HyperNikkiSystem Project