ちょい きゅうけい
最大の山こえたとこ
けっこーはまった
あともうひとつの山がある
めんどいだけな感じで
さっきの山よりまし
腰重しなのできゅうけいなう
とりま
その山直前までいきたいっす
いま
ほかんとこ
微調整中
でも
画像処理おもろー
ま、ちょー簡単な処理しかやってねーけど
アイコンもつくんねーとなあ
DTPやってるけど
アイコンデザイン能力ゼロなのが
かなしいっす
けっこーはまった
あともうひとつの山がある
めんどいだけな感じで
さっきの山よりまし
腰重しなのできゅうけいなう
とりま
その山直前までいきたいっす
いま
ほかんとこ
微調整中
でも
画像処理おもろー
ま、ちょー簡単な処理しかやってねーけど
アイコンもつくんねーとなあ
DTPやってるけど
アイコンデザイン能力ゼロなのが
かなしいっす
むしめがね2
めがね実装でけた
マスクPNGは白と黒にする
透明にしちゃったら
そこも画像うつっちったので
白にしたらめがね内に
拡大画像がおさまった
あと
大きさもかえた
画像の外にいったら
めがねがきえて
中に入ったら
めがねふっかつ
※めがね出現と消滅を
タッチ系のコード内に追加)
これですっきり
でも
コードが
すげー
ぐちゃぐちゃ
メモリリークも
対策せなあかん
いろいろ
やらねばならないこと
ありまくり
とりあえず
きょうはここまで
さきなげー
はやくつくりおえてー
マスクPNGは白と黒にする
透明にしちゃったら
そこも画像うつっちったので
白にしたらめがね内に
拡大画像がおさまった
あと
大きさもかえた
画像の外にいったら
めがねがきえて
中に入ったら
めがねふっかつ
※めがね出現と消滅を
タッチ系のコード内に追加)
これですっきり
でも
コードが
すげー
ぐちゃぐちゃ
メモリリークも
対策せなあかん
いろいろ
やらねばならないこと
ありまくり
とりあえず
きょうはここまで
さきなげー
はやくつくりおえてー
むしめがね
仕事の合間に
http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/
で勉強
1)
CGImageRef subImage = CGImageCreateWithImageInRect(imageRef, CGRectMake(touchPoint.x-18, touchPoint.y-18, 36, 36));
CGImageRef xMaskedImage = CGImageCreateWithMask(subImage, mask);
マスクすると
subImage(36X36)
が
mask(85X85)
の大きさに拡大される様子
参考(http://stackoverflow.com/questions/1326571/cgimageref-resize-without-scaling)
なので
CGImageCreateWithImageInRectで
拡大率を調節する
2)
CGContextDrawImage(context, area2, xMaskedImage);
CGContextDrawImage(context, area, overlay);
http://iphone-dev.g.hatena.ne.jp/Isoparametric/20080902/1220311874
によると
CGContextDrawImageすると
Quartzの仕様により
原点が左下になって
上下逆さにレンダリングされるらしー
なので
GAffineTransform xform = CGAffineTransformMake(1.0, 0.0,0.0, -1.0,0.0, 0.0);
CGContextConcatCTM(context, xform);
CGRect area = CGRectMake(touchPoint.x-42, -touchPoint.y, 85, 85);
CGRect area2 = CGRectMake(touchPoint.x-40, -touchPoint.y+2, 80, 80);
でアフィン変換で逆さにしてる様子
3)
HPのコードではメモリリークあるので
最後に
CGImageRelease(mask);
CGImageRelease(subImage);
CGImageRelease(xMaskedImage);
追加する
CGImageMaskCreateや
CGImageCreateWithImageInRectや
CGImageCreateWithMask
などCreate文で作ったものは解放する必要あり
参考(http://d.hatena.ne.jp/masatoshisw20/20081220/1229727292)
アフィン変換
//引数
// a b 0
// c d 0
// e f 1
CGAffineTransformMake(a, b, c, d, e, f);
//平行移動 (下記行列のx, yを指定する)
// 1 0 0
// 0 1 0
// x y 1
CGAffineTransform translate2 = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 100.0, 100.0);
[btn setTransform:translate2];
//スケール (下記行列のx, yを指定する)
// x 0 0
// 0 y 0
// 0 0 1
CGAffineTransform scale2 = CGAffineTransformMake(2.0, 0.0, 0.0, 2.0, 0.0, 0.0);
[btn setTransform:scale2];
//回転 (下記行列のsin, cosを指定する)
// cosA sinA 0
//-sinA cosA 0
// 0 0 1
float rd = 90.0f * (M_PI / 180.0f);
CGAffineTransform rotate2 = CGAffineTransformMake(cos(rd), sin(rd), -sin(rd), cos(rd), 0.0, 0.0);
[btn setTransform:rotate2];
http://d.hatena.ne.jp/ntaku/20090226/1235659545より抜粋
参考(http://ipr20.cs.ehime-u.ac.jp/column/gazo_syori/chapter3.html)
http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/
で勉強
1)
CGImageRef subImage = CGImageCreateWithImageInRect(imageRef, CGRectMake(touchPoint.x-18, touchPoint.y-18, 36, 36));
CGImageRef xMaskedImage = CGImageCreateWithMask(subImage, mask);
マスクすると
subImage(36X36)
が
mask(85X85)
の大きさに拡大される様子
参考(http://stackoverflow.com/questions/1326571/cgimageref-resize-without-scaling)
なので
CGImageCreateWithImageInRectで
拡大率を調節する
2)
CGContextDrawImage(context, area2, xMaskedImage);
CGContextDrawImage(context, area, overlay);
http://iphone-dev.g.hatena.ne.jp/Isoparametric/20080902/1220311874
によると
CGContextDrawImageすると
Quartzの仕様により
原点が左下になって
上下逆さにレンダリングされるらしー
なので
GAffineTransform xform = CGAffineTransformMake(1.0, 0.0,0.0, -1.0,0.0, 0.0);
CGContextConcatCTM(context, xform);
CGRect area = CGRectMake(touchPoint.x-42, -touchPoint.y, 85, 85);
CGRect area2 = CGRectMake(touchPoint.x-40, -touchPoint.y+2, 80, 80);
でアフィン変換で逆さにしてる様子
3)
HPのコードではメモリリークあるので
最後に
CGImageRelease(mask);
CGImageRelease(subImage);
CGImageRelease(xMaskedImage);
追加する
CGImageMaskCreateや
CGImageCreateWithImageInRectや
CGImageCreateWithMask
などCreate文で作ったものは解放する必要あり
参考(http://d.hatena.ne.jp/masatoshisw20/20081220/1229727292)
アフィン変換
//引数
// a b 0
// c d 0
// e f 1
CGAffineTransformMake(a, b, c, d, e, f);
//平行移動 (下記行列のx, yを指定する)
// 1 0 0
// 0 1 0
// x y 1
CGAffineTransform translate2 = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 100.0, 100.0);
[btn setTransform:translate2];
//スケール (下記行列のx, yを指定する)
// x 0 0
// 0 y 0
// 0 0 1
CGAffineTransform scale2 = CGAffineTransformMake(2.0, 0.0, 0.0, 2.0, 0.0, 0.0);
[btn setTransform:scale2];
//回転 (下記行列のsin, cosを指定する)
// cosA sinA 0
//-sinA cosA 0
// 0 0 1
float rd = 90.0f * (M_PI / 180.0f);
CGAffineTransform rotate2 = CGAffineTransformMake(cos(rd), sin(rd), -sin(rd), cos(rd), 0.0, 0.0);
[btn setTransform:rotate2];
http://d.hatena.ne.jp/ntaku/20090226/1235659545より抜粋
参考(http://ipr20.cs.ehime-u.ac.jp/column/gazo_syori/chapter3.html)