検索
カテゴリツリー
トップ
  未整理
  iPhoneアプリ開発
      未整理
      画像処理
リンク

CD&DVD Press
プレスやってます!


TECHLOG
UIImageで矩形領域の切り出し
元画像の特定領域を切り出して、新しい画像を作りたい場合。
(windowsでいうところのBitBlt)
-(UIImage*)imageByCropping : (UIImage*)_src rect:(CGRect)rect
{
	CGImageRef	ref = CGImageCreateWithImageInRect( [_src CGImage], rect );
	UIImage*	dst = [UIImage imageWithCGImage:ref];
	CGImageRelease( ref );
	return( dst );
}

posted by admin at 2010年12月22日

キーボードのサイズ取得
キーボードの表示/非表示で、スクロールビューなどのフレームサイズを変えたい場合。
-(void)viewDidLoad
{
	....

	//	キーボード表示時のイベント登録
	[ [NSNotificationCenter defaultCenter] addObserver:self
		selector:@selector(keyboardWasShown:)
		name:UIKeyboardDidShowNotification object:nil
	];
	//	キーボード非表示時のイベント登録
	[ [NSNotificationCenter defaultCenter] addObserver:self
		selector:@selector(keyboardWasHidden:)
		name:UIKeyboardDidHideNotification object:nil
	];
}

//	キーボード表示時
-(void)keyboardWasShown:(NSNotification*)notification
{
	NSDictionary* info = [notification userInfo];
	CGSize keyboard_size = [ [info objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size;

	//	keyboard_sizeにサイズが入るので、
	//	ここでviewのサイズ変更とか。
	//	CGRect rect = [scrollView frame];
	//	rect.size.height -= keyboardSize.height;
	//	scrollView.frame = rect;

	//	特定のコントロールまでスクロール
	//	CGRect textFieldRect = [activeField frame];
	//	[scrollView scrollRectToVisible:textFieldRect animated:YES];
}

//	キーボード非表示時
-(void)keyboardWasHidden:(NSNotification*)notification
{
	NSDictionary* info = [notification userInfo];
	CGSize keyboard_size = [ [info objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size;

	//	keyboard_sizeにサイズが入るので、
	//	ここでviewのサイズ変更とか。
}


posted by admin at 2010年12月20日

NSStringをurlencodeする。
リクエストパラメータに指定する文字列を、urlencodeする関数。
NSString*	param = @"ぱらめーた";

//	URLエンコード
NSString*	encode_param = [param
	stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//	URLデコード
NSString*	decode_param = [encode_param
	stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


posted by admin at 2011年01月07日

MySQLのロック解除方法
下記のようなエラーがでて、何もできない状態になってしまった場合。
「Lock wait timeout exceeded; try restarting transaction」

phpMyAdminで「show processlist」のコマンドを実行し、
プロセスを削除すればまた、アクセスできるようになる。
posted by admin at 2010年12月17日

ビューの内容を画像としてキャプチャする
指定したviewの、指定したrect領域をキャプチャして、UIImageで返却する。
-(UIImage*)imageCapture:(UIView*)view rect:(CGRect)rect
{
	CGPoint		pt = rect.origin;
	UIImage*	image;
	UIGraphicsBeginImageContext( rect.size );
	CGContextRef context = UIGraphicsGetCurrentContext();
	CGContextConcatCTM( context, CGAffineTransformMakeTranslation(-(int)pt.x, -(int)pt.y) );
	[view.layer renderInContext:context];
	image = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	return( image );
}

次の一行をソースの先頭に書かないと、
warning「No '-renderInContext' method found」が出る。
#import <QuartzCore/CALayer.h>

posted by admin at 2010年12月17日

画像の拡大縮小、カット
UIImageから、余分な部分をカットして小さくする。
UIImage*	cutImage( UIImage* src, CGSize size ){
	UIImage*	dst;
	UIGraphicsBeginImageContext( size );

	//	中心からサイズ分カット
	[src drawAtPoint:CGRectMake(
		(size.width - src.size.width) / 2,
		(size.height - src.size.height) / 2
	)];
	dst = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	return( dst );
}


画像を拡大縮小する
//  画像サイズを指定したsizeにする。
UIImage*	stretchImage( UIImage* src, CGSize size ){
	UIImage*	dst;
	UIGraphicsBeginImageContext( size );
	[src drawInRect:CGRectMake(0,0,size.width,size.height)];
	dst = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	return( dst );
}

上記の例では元画像の(0,0,size.width,size.height)で示される領域を、
新しいコンテキストにdrawInRectで転送している。
0,0の部分を変更することで転送開始位置を変更できる(マイナス値も可能)
posted by admin at 2011年02月08日

UDIDによる端末判定について
引用元
http://togetter.com/li/28715

>伝統的な日本式ケータイで「ユーザID」による認証が行われてきたのは、
>それがゲートウェイ付与型のIDだからであって、
>UDIDのような端末付与型の公開IDで同様のことをしようとしても不可能です。


>乱数で専用IDを生成する際には、暗号論的擬似乱数生成器
>(cryptographically secure PRNG)を使用する必要がある
>のでご注意ください。推測不可能性と無衝突性が求められます。
>メルセンヌツイスター等は使えません。


posted by admin at 2010年11月09日

さくらレンタルサーバでphpMyAdminを動作させる
OSはRedHat、標準メニューソフトウェアでPHP/MySQLがインストール済みの環境において、
mysql/phpMyAdminを動作させる手順です。

adminアカウントで、telnet接続する。
suコマンドで、rootになる。
[admin@localhost ~]# su

mysqlを起動してみる。
[root@localhost admin]# /etc/init.d/mysql start

終了は、
mysql > quit

とする。

phpMyAdminをインストールする。
root権限のまま、下記を実行

[root@localhost ~]# svn checkout https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/tags/RELEASE_2_11_9_4/phpMyAdmin phpmyadmin
[root@localhost  ~]# mv phpmyadmin/ /var/www/
[root@localhost  ~]# cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php
[root@localhost  ~]# chmod 660 /var/www/phpmyadmin/config.inc.php
[root@localhost  ~]# yum -y install expect

パスフレーズを作成する。
[root@localhost  ~]# mkpasswd -l 46

すると、長ったらしい文字列が表示されるので、
それをメモっておき、下記コマンドを実行。
[root@localhost  ~]# vi /var/www/phpmyadmin/config.inc.php

開かれたファイル内の、$cfg['blowfish_secret']の値部分に、
メモっておいたフレーズを入力して、上書き保存。

[root@localhost  ~]# chown -R root.apache /var/www/phpmyadmin/
[root@localhost  ~]# vi /etc/httpd/conf.d/phpmyadmin.conf

viで新しいファイルが開かれるので、次の一行を挿入して、上書き保存。
Alias /phpmyadmin /var/www/phpmyadmin

WEBサーバ再起動
[root@localhost  ~]# /etc/rc.d/init.d/httpd restart


ここまででphpMyAdminが入るので、あとは
http://ホスト/phpmyadmin で表示できる。

最初は、rootユーザのパスワードがないので、設定しておく。

まずはmysqlに接続。
[root@localhost  ~]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

この状態で、パスワードを変更するコマンドを実行
mysql> set password=PASSWORD('testpassword');

'testpassword'の部分が、変更後のパスワードとなる。

posted by admin at 2010年11月08日

メモリの使いすぎで落ちる場合の対策
使用メモリが増えてくると、Level1エラーとかLevel2エラーとかでて、
最終的にLevel3エラーが出るとおちる。

メモリをログに出力するコード
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if( task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)!= KERN_SUCCESS )
{
	NSLog(@"%s(): Error in task_info(): %s",
		__FUNCTION__, strerror(errno));
}

//	物理メモリの使用量(byte)
u_int rss = t_info.resident_size;
NSLog(@"RSS: %u Bytes", rss);



◎ UIKitでの対策
[UIImage imageNamed:@"xxx"]

のように画像を確保すると、高速に読み込めるが、システムが不正落ちするまで、メモリに保持し続ける。
一般的にはシステム全体で使うような共用画像を読み込むんだと思う。

なので、ぱらぱらアニメとかを実現するためには、まじめに1行ずつ書いていく。
//	1. リソースから読み込む
NSString* path = @"test.jpg";
NSString* imagePath;
UIImage* img;
imagePath = [
	[NSBundle mainBundle]
	pathForResource: path.stringByDeletingPathExtension
	ofType: path.pathExtension
];
//※ NSStringのstringByDeletingPathExtensionは、パスからファイル名の部分のみを抽出する
//※ pathExtensionは、拡張子の部分のみを抽出する

//	2. UIImageをまじめに作る
img = [ [UIImage alloc] initWithContentsOfFile:imageFile];

//	3. UIImageViewにセットする
[imgView setImage:img];

//	4. 3.で参照カウントが増えるので、リリースしとく
[img release];


◎ cocos2d

CCTextureCacheというクラスで、一度読み込んだテクスチャは保持するが、
解放する処理が見つからない。

画像を一杯使うような部分では、こまめに解放してやるほうがよさそう。
CCTextureCache* cache = [CCTextureCache sharedTextureCache];
[cache removeUnusedTextures];

とする。 参照されていないテクスチャのみを消すため安心。
シーン遷移の時などにもやるとよいかも。

posted by admin at 2010年11月01日

AVAudioPlayerによる多重再生
AVAudioPlayerでmp3を使うと、多重再生ができない。
多重再生を行うにはcafファイルを使用する必要があるが、
macのターミナルで簡単に作れる。
/usr/bin/afconvert -f caff -d ima4 sound.mp3 sound.caf

これで、sound.mp3からsound.cafファイルが作成される。

posted by admin at 2011年01月17日

26件中、 11件目~ 20件目 を表示中
<前ページ>   <次ページ>