まえがき
1月17日に、他の多くの人と同様に、Skypeのチャット画像に関するzhovnerの記事へのリンク( http://habrahabr.ru/blogs/skype/136395/ )を送ってくれました。
素晴らしいアイデアです。すぐにimg4skype.comサービスで生成された写真の交換を開始しましたが、多くの場合、それらが引き伸ばされて表示されることが判明しました。

zhovnerコードスニペットを見て、すぐに1つの空白文字を削除することで簡単に修正できることがわかりました。
このコードを修正するだけです。
$out .= '<font color="#'.strtoupper(dechex($color)).'">███</font>';
このように:
$out .= '<font color="#'.strtoupper(dechex($color)).'">██</font>';
したがって、ローカルバージョンのサービスが迅速に作成され、ピクセルあたりの空白文字の数(2または3)を選択できるようになりました。
* ただし、3文字ではなく2文字の空白文字でも画像のサイズが変更されるため(1:1ではなく4:3になります)、後で元の画像に圧縮を追加しました(1:1 => 3:4、4:3を歪ませた後、再び1:1になります)ピクセルごとに2つのスペースが選択されている場合。
最適化
1.同系色の組み合わせ
表面にあり、zhovner自身が表明したアイデアは、類似した色の組み合わせです。
2つの赤いピクセルが連続している場合、次のコードが生成されます。
<font color="#ff0000">███</font><font color="#ff0000">███</font>
これが単純化できることは明らかです。
<font color="#ff0000">██████</font>
このようにして、<font color = "#ff0000"> </ font>コードで占有されるメッセージのスペースを節約します。これにより、29キャラクターが解放されます(9または14ピクセル)(ピクセルあたりのスペースの数によります)。
これは非常に重要です。画像のサイズは、Skypeの最大メッセージ長によって制限されるためです。
この最適化はすでに数人のHabrausersによって実装されているため、コード全体を再度使用する理由はありません。
色の比較についてのみ詳しく説明します。
実験的に、次の機能に到達しました。
// compare colors function compare_clr( $c1, $c2, $max_dif, $img_px_qs ) { $r1 = ( $c1 >> 16 ) & 0xFF; $g1 = ( $c1 >> 8 ) & 0xFF; $b1 = $c1 & 0xFF; $r2 = ( $c2 >> 16 ) & 0xFF; $g2 = ( $c2 >> 8 ) & 0xFF; $b2 = $c2 & 0xFF; $r_dif = abs( $r1 - $r2 ); $g_dif = abs( $g1 - $g2 ); $b_dif = abs( $b1 - $b2 ); $k = 1; if( $img_px_qs == 1 ) // max quality { $def_k = 0.65; // check difference in color channels $dr = ( $r_dif > 0 ) ? $def_k : 0; $dg = ( $g_dif > 0 ) ? $def_k : 0; $db = ( $b_dif > 0 ) ? $def_k : 0; $k = $dr + $dg + $db; if( $k < 1 ) { $k = 1; } } else // max size { $k = 1; } $rv = true; if( ( $r_dif*$k > $max_dif ) || ( $g_dif*$k > $max_dif ) || ( $b_dif*$k > $max_dif ) ) { $rv = false; } return $rv; }
最初の2つのパラメーターは色、3番目のパラメーターは比較のしきい値、カラーチャネル間の最大差(0〜255)、4番目のパラメーターは最大品質または最大サイズです。
チャンネル(r、g、b)に違いを生じさせずに、色全体を互いに比較する場合、画質には多くのことが望まれます。 写真は非常に速く「にじみます」。
したがって、個々のチャネルを比較します。 少なくとも1つのチャネルの色差がしきい値を超えると、色は異なると見なされます。
係数を含む式は、最高の品質を提供し、ブラーを除去します。 複雑なマルチカラー画像(写真)に適しています。
単純な比較ではより大きなサイズが得られますが、複雑な画像では、小さな比較しきい値でもぼやけが発生します。 ただし、この式を使用すると、単純な顔文字や白黒のトロールの顔の大きな画像を生成できます。
2.原色
表面にあるもう1つの重要な最適化は、背景色です。
引用:
「黒ピクセルは既に黒なので、まだ色を付けることはできません。」
黒のピクセルは実際には黒ではなく、デフォルトです。 その色は、コードの最初のタグによって設定されます。img4skypeには色がないため、デフォルト(ほぼ黒)です。
<font size="1">...
最初のタグにフォントの色を追加すると、画像全体のデフォルトの色になります。
<font size="1" color="#ff0000">...
そして、各赤いピクセルまたはそのシーケンスに対して、<font color = "#ff0000"> </ font>タグを挿入する必要はありません。前の色の<font>を閉じて、タグなしで空白を記述します。
画像がロゴ/顔文字/均一な背景の画像である場合、この最適化によりサイズが非常に大きくなります。
そのため、画像コードを生成する前に、まずすべてのピクセルを調べて最も一般的な色を見つける必要があります。
imagecopyresampled( $newimg, $img, 0, 0, 0, 0, $neww, $newh, $imgw, $imgh ); // find most popular color $c_arr = array(); for( $j = 0; $j < $newh; $j++ ) { for( $i = 0; $i < $neww; $i++ ) { $cur_clr = imagecolorat( $newimg, $i, $j ); if( isset( $c_arr[$cur_clr] ) ) { $c_arr[$cur_clr]++; $found = true; } else { $c_arr[$cur_clr] = 1; } } } $max_cnt = 0; $def_clr = 0; // most popular color foreach( $c_arr as $key => $val ) { if( $val > $max_cnt ) { $max_cnt = $val; $def_clr = $key; } }
3.最大サイズ
さらに、人々がサイズをいじり、この式の定数800を変更したいことがすぐに明らかになりました。
$newh = floor(sqrt(800 / $ratio));
800を1000または1200に置き換えると、一部の写真を大きくすることができ、それらのコードはSkypeに配置され、800に収まらないものもあります。
したがって、次のステップは、この定数をユーザーが選択できる変数にすることです。
しかし、これは半分の尺度です。サイズと品質を可能な限り大きくするために、パラメータを丹念にいじる必要があるからです。
したがって、可能な最大の画像をすぐに生成します。 セグメントを半分に分割することにより、上の式の最大定数値とSkypeメッセージに収まる最大長の結果が得られるまでコードを生成します。
現在、ユーザーは、人間の目だけが理解できる品質のみを気にする必要があります。
私たちが彼らのために行う他のすべて。
PS
img4skype.comが開発されていないこと(既成のコードで実装されたアイデアでさえ追加されていないこと)を発見したため、独自のアナログskypeimg.comを作成することにしました。 この記事で書かれていることはすべてここに実装されています。
すべての機能は「タイムテスト済み」です-2012年1月20日からサービスで機能します。
以下に、ジェネレーターの動作例をいくつか示します(Skypeの1:1スケールのスクリーンショット)。

私は元のアイデアをzhovnerに感謝し、将来、競合他社の出現を誘発しないように、シンプルで明白な機能を完全に実装したいと思います!
UPD。 コメントが考慮され、サイトが更新され、疑わしいコンテンツはすべて削除されました。 ギャラリーには、ユーザーが生成したものは表示されなくなり、アルバムからの写真のみが表示されます。