写真に青いレイヤーを乗算してみる
こないだ本屋で見た上野樹里が表紙の雑誌「Levi’s book ROCKS」がえらいかっこ良かったのでFlashで真似てみる。透明度0.9くらいの青いベタ塗りを写真の上に引いて、ブレンドモードを乗算にして写真の彩度とコントラストを少々弄るとそれっぽくなった。
うーん、何かに使えないかなー。
こないだ本屋で見た上野樹里が表紙の雑誌「Levi’s book ROCKS」がえらいかっこ良かったのでFlashで真似てみる。透明度0.9くらいの青いベタ塗りを写真の上に引いて、ブレンドモードを乗算にして写真の彩度とコントラストを少々弄るとそれっぽくなった。
うーん、何かに使えないかなー。
リサイズしてシャープなし

リサイズしてシャープあり

PHPで画像にシャープをかける方法。imageconvolution()関数がPHP5対応なので注意する事。中身は畳み込み配列を使って調整しているだけ。リサイズをプログラムに任せると、ゆるい画像になるのでシャープをかけることで引き締まる。サムネイルを作るときには一手間かけてやること。
sharp.php5
$img = imagecreatefromjpeg("toco-toucan.jpg");
$matrix = array(array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1));
imageconvolution($img, $matrix, 8, 0);
imagejpeg($img, "toco-toucan_sharp.jpg", 100);
//-----[メモリの解放]
imagedestroy($img);
技術的なエントリーは久しぶりだなー。CBCNETで連載されているtrick7のteraさんの記事が面白かったので、自分なりにやってみる。この表現って素敵ですよね。記事にもあるようにPhotoshopでの参考サイトがあるので、これに忠実にActionScript3で再現してみる。元画像はこちら。
まずは画像をムービークリップに内包してステージにインスタンス名を「photo」にして配置。Tweenerでコントラストと彩度と明度を調整する。次にこのmcをBitmapDataでキャプチャしてコピー。コピーにも色を同じように調整して、ブラーをかける。新たにに円形グラデーション用のmcを作ってscaleYを半分にして楕円型にする。マスクするmcとマスクされるmcの両方にcacheAsBitmapをtrueに設定。最後にマスクをかけて完成と。
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.display.GradientType;
import flash.geom.Matrix;
import caurina.transitions.Tweener;
import caurina.transitions.properties.ColorShortcuts;
import caurina.transitions.properties.FilterShortcuts;
public class Main extends Sprite
{
public function Main():void
{
ColorShortcuts.init();
FilterShortcuts.init();
setToyFilter();
}
private function setToyFilter():void
{
//-----[色調整 ボケなし]
Tweener.addTween(photo, { _contrast:0.6, _saturation:1.6, _brightness:0.2 } );
//-----[キャプチャしてコピー]
var bmd:BitmapData = new BitmapData(photo.width, photo.height);
bmd.draw(photo);
var bm:Bitmap = new Bitmap(bmd);
var sp:Sprite = new Sprite();
sp.addChild(bm);
addChild(sp);
sp.x = photo.x;
sp.y = photo.y;
swapChildren(photo, sp);
//-----[色調整 ボケあり]
Tweener.addTween(sp, { _contrast:0.6, _saturation:1.6, _brightness:0.2, _Blur_blurX:5, _Blur_blurY:5, _Blur_quality:2 } );
//-----[グラデーションマスクの設定]
var gmask:Sprite = new Sprite();
var radius:uint = photo.width / 1.5;
var scale:Number = 1.0 / 1638.4 * radius * 2;
var m:Matrix = new Matrix();
m.identity();
m.scale(scale , scale);
addChild(gmask);
gmask.x = photo.x + photo.width / 2;
gmask.y = photo.y + photo.height / 2;
gmask.scaleY = 0.5;
gmask.graphics.lineStyle();
gmask.graphics.beginGradientFill(
GradientType.RADIAL,
[0x000000, 0x818181, 0xFFFFFF],
[1.0, 0.4, 0],
[120, 200, 255],
m
);
gmask.graphics.drawCircle(0, 0 , radius);
gmask.cacheAsBitmap = true;
photo.cacheAsBitmap = true;
photo.mask = gmask;
}
}
}
参考サイトでは被写体をパスで切り抜いて輪郭を強調してるけどFlashではそこまで出来ないのでピンのゆるさはご愛敬。写真素材をそれっぽいの使えば、擬似的に似せることは出来そうだなー。
追記
northprintさんがwonderflでPixel Bender版を公開されてます。こちらも勉強になります。
画像処理の勉強としてRGBとCMYの色分解をやってみた。色々試したけどCMYKの4色に分解する方法がまだ良く分かんない。という事で画像処理入門の本をamazonで購入した。明日届いたらもうちょいやってみる。
JPEG画像にはExif以外にもIPTCという規格が存在する。検索用キーワードを埋め込んだり、任意のコメントを写真に残したい場合にこれを使う。デジカメで撮った写真にローカルPCでコメント、キーワードを埋め込んで、ファイルをアップロードするだけで自動的にテキスト情報をデータベースに登録みたいな事をしたいので調べてみる。Exif情報を取り出したときとほぼ一緒な感じ。
$size = GetImageSize ("photo/00001.jpg", $info);
$iptc = iptcparse ($info["APP13"]);
if(isset($info["APP13"]))
{
if(is_array($iptc))
{
echo "caption=".$iptc["2#120"][0]."<br />";
echo "graphic_name=".$iptc["2#005"][0]."<br />";
echo "urgency=".$iptc["2#010"][0]."<br />";
echo "category=".$iptc["2#015"][0]."<br />";
echo "supp_categories=".$iptc["2#020"][0]."<br />";
echo "spec_instr=".$iptc["2#040"][0]."<br />";
echo "creation_date=".$iptc["2#055"][0]."<br />";
echo "photog=".$iptc["2#080"][0]."<br />";
echo "credit_byline_title=".$iptc["2#085"][0]."<br />";
echo "city=".$iptc["2#090"][0]."<br />";
echo "state=".$iptc["2#095"][0]."<br />";
echo "country=".$iptc["2#101"][0]."<br />";
echo "otr=".$iptc["2#103"][0]."<br />";
echo "headline=".$iptc["2#105"][0]."<br />";
echo "source=".$iptc["2#110"][0]."<br />";
echo "photo_source=".$iptc["2#115"][0];
}
}
PHPでサムネイルを作ってみる。まずは「image」、「thumb」フォルダを作る。photoフォルダにtest.jpgをアップロードしておく。下記のコードでは元画像のサイズを3872×2592、サムネイルのサイズを120×80とする。クオリティを0~100で好みに調整する。(100にしないと画像がざらつく)
あとはこのPHPにアクセスするだけでサムネイルを生成してくれる。アップロード用のPHPにこういった処理を持たせてやると自作フォトログの画像管理が楽になるな。Flashでフォトログのインターフェイス作るよりも、こういった機能周りのコード書くほうが楽しくなってきた。
$imagePath = "image/";
$thumbPath = "thumb/";
$imageName = "test.jpg";
$imageW = 3872;
$imageH = 2592;
$thumbW = 120;
$thumbH = 80;
$quality = 100; //jpgの保存品質(0-100)
$photo = @imagecreatefromjpeg($imagePath.$imageName);
if($photo)
{
//-----[サムネイルの領域確保]
$thumb = imagecreatetruecolor($thumbW, $thumbH);
//-----[画像をリサイズ]
$result = imagecopyresampled($thumb, $photo, 0, 0, 0, 0, $thumbW, $thumbH, $imageW, $imageH);
//-----[jpgファイルに保存]
imagejpeg($thumb, $thumbPath.$imageName, $quality);
//-----[メモリの解放]
imagedestroy($thumb);
imagedestroy($photo);
echo "
";
}
else
{
echo "画像読み込みエラー";
}
思った以上に簡単にカメラ機種や撮影時間などのメタデータを取得できた。flickrを使うと自動的にExif情報をゲットできるみたいだけど、自作でフォトビューワーとか作りたい人(自分)のために。以下のExifAll.phpでExif情報の一覧を取得可能。ちなみにデジカメで撮った画像をフォトショで「Web用に保存」してしまうとExif情報が削除されるので注意が必要。
ExifAll.php
$exif = exif_read_data('img/test.jpg', 0, true);
foreach ($exif as $key => $section)
{
foreach ($section as $name => $val)
{
echo "$key.$name: $val\n";
}
}
続いて欲しい情報だけを取り出すソース。
ExifSelect.php
$exif = exif_read_data('img/test.jpg', 'IFD0', 1, true);
echo "Make = ".$exif['IFD0']['Make']."\n";
echo "Model = ".$exif['IFD0']['Model']."\n";
echo "ExposureTime = ".$exif['EXIF']['ExposureTime']."\n";
echo "ApertureFNumber = ".$exif['COMPUTED']['ApertureFNumber']."\n";
echo "ISOSpeedRatings = ".$exif['EXIF']['ISOSpeedRatings']."\n";
echo "DateTimeOriginal = ".$exif['EXIF']['DateTimeOriginal']."\n";
echo "ExposureBiasValue = ".$exif['EXIF']['ExposureBiasValue']."\n";
echo "ExifImageWidth = ".$exif['EXIF']['ExifImageWidth']."\n";
echo "ExifImageLength = ".$exif['EXIF']['ExifImageLength']."\n";
echo "WhiteBalance = ".$exif['EXIF']['WhiteBalance']."\n";
echo "DigitalZoomRatio = ".$exif['EXIF']['DigitalZoomRatio']."\n";
COMPUTED、THUMBNAILおよびCOMMENTのセクションは常に配列となるため、それに合わせる為にexif_read_data()の第3引数を1にする。これで全てのセクションと値を配列として格納するため、2次元配列のカタチで取得できるようになる。詳しくはこちらを参照。
※セクション名の付け方は各メーカーによって異なるようです。上記のソースはNikonのD80で撮影した画像のExif情報を元にしています。他メーカーの場合は一覧を取得するExifAll.phpでセクション名を確認してください。
をやってみる。色々調べるとWindowsサーバーで動く有名なキャプチャアプリがあるらしい。これをサーバーに置いて、phpからコマンドラインでつついてやるだけで驚くほど簡単に実装できる。キャプチャサイズやファイル形式、遅延時間などの細かい設定も可能。出力される画像もかなりキレイ。これでサムネイルを掃き出してくれます。
$url = $_GET['url'];
$filename = date('YmdHis').".jpg";
$cmd = "CrenaHtml2jpg -o$filename -fjpeg -w800x600 -s200x150 -q100 -d72 -t25 -l5 -u$url";
system($cmd);
echo "<img src="$filename" alt="" />";