みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

iphoneの画像加工プログラミングで

現在、iphoneの画像加工プログラミングを「CoreGraphics」を使用して行っております。
書籍の「iphone デジカメプログラミング」を参考にしながら、カメラで撮影した画像の輝度の調整を行いたいのですが、うまく行かずに立ち往生しております。

▼書籍サイト
http://www.sbcr.jp/products/4797362329.html

下記が開発内容です。コードが長くなって恐縮ですが、全て掲載してみました。

また、変換前の画像と変換後の画像も掲載しております。

▼開発環境===============
Mac
XCode Ver3.2.6
iPhoneOS4.3.sdk

▼コード===============
//ボタンを押したら輝度フィルターを稼働
-(IBAction)tapBri2{
UIImage *objImgProc = [[cbViewController alloc]init];
myImageView.image = [objImgProc imgProcBri:10 lblPic:myImageView.image];
};

//輝度の変更フィルター
-(UIImage *)imgProcBri:(NSInteger)pixel lblPic:(UIImage *)pic{
// CGImageを取得する
UIImage *shrinkedImage = pic;
CGImageRef cgImage;
cgImage = shrinkedImage.CGImage;

CGContextRef cgctx = [self createARGBBitmapContext:cgImage];
size_t w = CGImageGetWidth(cgImage);
size_t h = CGImageGetHeight(cgImage);

// ビットマップデータのポインタアドレスを取得
unsigned char *data = CGBitmapContextGetData (cgctx);
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
//ARGBだから4バイトずつ移動
int index = (y * w + x)*4;
unsigned char r = data[index+1];
unsigned char g = data[index+2];
unsigned char b = data[index+3];

// RGBからYUVを求める
CGFloat Y = 0.299*r + 0.587*g + 0.114*b;
CGFloat U = -0.169*r - 0.331*g + 0.5*b;
CGFloat V = 0.5*r - 0.419*g - 0.081*b;
// 輝度値を変更
//Y = Y+ [self.curriphoentValue intValue];
Y = Y+ pixel;
// YUV => RGBに変換
data[index+1] = [self normalizeToChar:Y + 1.402*V];
data[index+2] = [self normalizeToChar:Y - 0.344*U - 0.714*V];
data[index+3] = [self normalizeToChar:Y + 1.772*U];
}
}
// CGBitmapContextからCGImageを作成
CGImageRef effectedCgImage = CGBitmapContextCreateImage(cgctx);
CGContextRelease(cgctx);
free(data);

UIImage* effectedImage = [[UIImage alloc] initWithCGImage:effectedCgImage];
[effectedImage autorelease];

// 作成したデータを解放する
CGImageRelease(effectedCgImage);
return effectedImage;
}

// CGImageからCGBitmapContextを作成するメソッド。引数のCGImageからCGBitmapContextを作成する。
-(CGContextRef) createARGBBitmapContext:(CGImageRef) inImage {
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;

size_t pixelsWidth = CGImageGetWidth(inImage);
size_t pixelsHight = CGImageGetHeight(inImage);

// 色空間は、ARGBで作成
colorSpace = CGColorSpaceCreateDeviceRGB();
// 画素値はA,R,G,Bの4バイトなので、ビットマップデータの1行あたりのバイト数は、画像幅 x 4バイト
bitmapBytesPerRow = (pixelsWidth * 4);
// 全体でのビットマップデータのバイト数は、1行あたりのバイト数 x 画像高さ
bitmapByteCount = (bitmapBytesPerRow * pixelsHight);
// ビットマップデータのメモリを確保
bitmapData = malloc( bitmapByteCount );
// CGBitmapContextオブジェクトを作成
context = CGBitmapContextCreate (bitmapData,
pixelsWidth,
pixelsHight,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease( colorSpace );
// CGImageを描画
CGContextDrawImage(context, CGRectMake(0,0,pixelsWidth,pixelsHight), inImage);

return context;
}

ご教授いただければ大変有り難く存じます。
何卒宜しくお願い致します。

投稿日時 - 2011-07-10 20:32:10

QNo.6867313

すぐに回答ほしいです

質問者が選んだベストアンサー

normalizeToChar も問題なしですね。

View-Based Application を作成して、

- ( void )viewDidLoad {
[ super viewDidLoad ];
imageView.image = [ UIImage imageNamed:@"hoge.jpg" ];
}

で表示させた画像を使って試してみましたけど、こちらの環境 ( Xcode 3.2.6、iOS 4.3、iPhone Simulator 4.3 ) では問題ありませんでした。

>-(IBAction)tapBri2{
>UIImage *objImgProc = [[cbViewController alloc]init];

となっているところが、cbViewController は UIViewController の派生クラスかと思われますが、受け取っているのが UIImage なので、なんだかよくわからなくて気になる点ではありますが、それが原因とも思えず、正直、何が原因なのかわかりません・・・。


ちなみに、試してみたプログラムでは imgProcBri: などのメソッドは全て ViewController に実装し、

- ( IBAction )buttonTapped:( id )sender {
imageView.image = [ self imgProcBri:10 lblPic:imageView.image ];
}

としました。

投稿日時 - 2011-07-11 19:30:43

お礼

ご指摘いただいた「normalizeToChar」を、フィルターより前に記述すると、不思議なことに警告が消えて、通常に稼働するようになりました。

大変助かりました。ご丁寧なアドバイス有難うございます。

投稿日時 - 2011-07-12 12:29:53

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

normalizeToChar: の中身はどういう処理になってますか?
normalizeToChar が原因ではないかという気がします。

投稿日時 - 2011-07-11 13:20:25

補足

ご返答有難うございます。内容は下記となっております。


- (unsigned char)normalizeToChar:(CGFloat)value {
// 0 - 255の範囲に設定
return value<0?0:value>255?255:value;
}

他ご不明な点があればご遠慮なくお申し付けください。

投稿日時 - 2011-07-11 15:59:40

あなたにオススメの質問