« 5分でできるウェブサーバのセキュリティ向上施策 | メイン | JavaScriptライブラリといえば jQuery(入門編) »

角丸画像を簡単に作る
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

Keitaです。最近、モテるためにがんばっていますが、周りの女性は誰一人として振り向いてくれません。
さて、そんなわけで、世間では、いろいろな角を丸めると、モテるといううわさを聞いてとりあえず角を丸めることにしてみました。

でも、CSSの角を丸める方法は、わりと論争の的でこれがいいよ!と人に勧める知識もないので、とりあえず、画像を丸めてみることにしました。

今回も、Webアプリケーションに関する面倒な問題を簡単に解決するツール、PHPを利用します。

画像を加工するのに何使うは、結構、選択肢があるのですが、そのものずばりの関数があるimagick 2.0を使いたいと思います。

コードはこんな感じです。
<?php
     $image =& new Imagick();
     $image->readImage('test2.jpg');  // ファイルを読み込む
     $image->roundCorners(20, 20);    // 角の半径を指定する
     $image->setImageFormat('png');   // 画像形式をpngに
     $image->writeImage('test2r.png'); //ファイルに保存

これで、完了です。
なんて簡単!
それでは、よい角丸ライフを!!


っと、まだリリースもしてない拡張をトピックに出すだけだと気が引けるので、MagickWand用のコードも載せておきたいと思います。

先のimagick 2.0.0を参考に、さくっとつくったもので、わりと検証してなかったり変数名なんだよとかいう感じですが、気にしないでください
//MagickWand 1.0.4+ 6.3.3.1にて動作確認
function MagickRoundcorners($hwnd, $xRounding, $yRounding,$strokeWidth  = 10, $displace = 5, $correction = -6)
{
    $imageWidth = MagickGetImageWidth($hwnd);
    $imageHeight = MagickGetImageHeight($hwnd);

    if ($imageWidth === false || $imageHeight === false){
        return false;
    }

    $status = MagickSetImageType($hwnd, MW_TrueColorMatteType);

    
    $color = NewPixelWand();
    $draw = NewDrawingWand();
    $maskImage = NewMagickWand();

    $status = PixelSetColor($color, "transparent");

    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    $status = MagickNewImage( $maskImage, $imageWidth, $imageHeight, $color );
    
    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    MagickSetImageBackgroundColor($maskImage, $color);
    $status = PixelSetColor($color, "white");
    
    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    DrawSetFillColor($draw, $color);
    $status = PixelSetColor($color, "black");
            
    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }
    
    DrawSetStrokeColor($draw, $color);
    DrawSetStrokeWidth($draw, $strokeWidth);

    DrawRoundRectangle($draw, $displace, $displace, $imageWidth + $correction, $imageHeight + $correction, $xRounding, $yRounding );
    $status = MagickDrawImage($maskImage, $draw);

    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }


    $status = MagickCompositeImage($hwnd, $maskImage, MW_DstInCompositeOp, 0, 0);
    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    $draw = NewDrawingWand();
    $maskImage = NewMagickWand();
    $color = NewPixelWand();

    $status = PixelSetColor($color, "transparent");

    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    MagickNewImage($maskImage, $imageWidth, $imageHeight, $color );


    DrawSetFillColor($draw, $color);
    DrawSetStrokeColor($draw, $color);
    DrawSetStrokeWidth($draw, 2);


    DrawRoundRectangle($draw, 0, 0, $imageWidth, $imageHeight, $xRounding, $yRounding);
    MagickSetImageBackgroundColor($maskImage,$color);
    $status = MagickDrawImage($maskImage,$draw);

    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    
    $status = MagickCompositeImage($hwnd, $maskImage, MW_OverCompositeOp, 0, 0);
    
    if ($status === false) {
        MyMagickDestoryWand($maskImage, $color, $draw);
        return false;
    }

    MyMagickDestoryWand($maskImage, $color, $draw);
    
    return true;
}

function MyMagickDestoryWand($mwand, $pwand, $dwand)
{
    DestroyMagickWand($mwand);
    DestroyPixelWand($pwand);
    DestroyDrawingWand($dwand);
}
使い方
$image =  NewMagickWand();
MagickReadImage($image, 'file.jpg');
MagickRoundcorners($image, 20, 20);
MagickSetFormat($image, 'png');
MagickWriteImage($image, 'file.png');
最後に、コードなんて書きたくないよ!というものぐさなあなたのために、角を丸くしてモテるページを用意してみました。
といってもお昼休みにちゃちゃっとつくったものなので、なんか、致命的なバグがあるかもしれませんので、あんまりいじめないでください。(今、一部うごかないらしいです。)

それでは、よいモテライフを!

PS.ほれたでしょうか?

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/943

コメント

>PS.ほれたでしょうか?

ほれました(笑)

> Anonnymousさん
ありがとうございます。
生まれて初めてモテることができて、大変うれしいです。式場を探してきます。

ティモテ…

こんにちわ!
角丸を置いているサーバは、ウノウのものではなく個人のサーバなので、ちょっとおかしいものがおいてあるかもしれませんね!

初めまして
自分も、モテたくてImagickで角円に挑戦したんですが
出来上がった画像は、元のままの画像でした。

windowsでは無理なのでしょうか?
モテるのは無理なのでしょうか・・・(;_;)

環境は、下記のような感じです。
Windows XP
2.1.0-rc3
ImageMagick 6.3.3 04/21/07 Q16

とってもモテたいです。
他に、モテる方法
MASKで角まるにする方法とかはあるのでしょうか?

はじめまして、
最近はとがってるとモテやすいと聞いています。

Imagick2.1.0は、僕の手元の環境では動いていて、ちょうどURLでかいたページがrc3です。
もしよければ、再現するかどうか試してみてください。

Windowsのほうでは僕は検証環境をもっていなくて、今はためせないのですが、読み込むファイル名と書き出すファイル名が違っていても、同じファイルを書き出してしまう感じでしょうか。

あと、画像形式によってはImageMagickがおかしい動きしたりするので、そちらも注意が必要な場合があります。

MASKで角丸とかも僕はためしてないので、ちょとわかりません。
でも、きっともてると僕は信じてます。

最近はほかの画像ライブラリも勉強中です、近いうちにまたこのブログでかけたらとおもってますのでお楽しみに~

おばんさまです。

お返事ありがとうございました。
URLのページは無事かどまるになったんですが

自分の環境では、php5.2.0&5.2.4では、ファイル名を替えても元画像と同じでした。

ちなみに、あっちこっち探してroundCornersを使っている他の
サンプルも試したんですが全部同じ状態です。

でも、安心しました。
丸くなくてもモテそうだとの事で(>_

おばんさまです。

お返事ありがとうございました。
URLのページは無事かどまるになったんですが

自分の環境では、php5.2.0&5.2.4では、ファイル名を替えても元画像と同じでした。

ちなみに、あっちこっち探してroundCornersを使っている他の
サンプルも試したんですが全部同じ状態です。

でも、安心しました。
丸くなくてもモテそうだとの事で(>_

コメントを投稿


画像の中に見える文字を入力してください。