質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.32%

iPhone画面のスクリーンショット-2

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 982

northpotato

score 37

ios9, iPod touch, xcode7 初心者です。 
側弯症という背骨が横に曲がる児童を前屈させ
背中の傾斜を加速度センサーを使用し、[start]によって
測定開始し、[stop]によって得られたiPod touch 画面を スクリーンショットし、 
写真として本体に記録保存を目指しています。 

イメージ説明

顔の下の青/黄/赤の横バーは storyboard 上に配置した
image View上に描かせてあります。

!イメージ説明

下記プログラムの最後の部分で、スクリーンショットを試みているのですが無反応です。
なお、スイッチ文は、測定時間の長さにかかわらず、表示を標準化するためのものです。
コンパイルエラーは、生じていません。

どなたかご教示頂けたら、幸いです。 よろしくお願いいたします。


イメージ説明

画像追加しました。
スクリーンショットのプログラムは実行されており、imageView にも、
正しく、データは格納されいるようです。
ただ、これを、iPodtouch のアプリ「写真」に記録するのに

     //UIImageJPEGRepresentation(*imageView, 0.8f);

    // UIImageWriteToSavedPhotosAlbum(*imageView, nil, nil, nil);

など使ってみましたが、エラーが出たり、画像が写真として記録されませんでした。
引数の名前が違うのかもしれません。
宜しくお願い致します。

-(void)stop_standardize {

    // angle_ar[] に入った傾斜角を、10個(0〜9)の配列 angle_disp に再格納し、再表示

    int kizami;
    int kcount;
    int angle_max_temp;

    // angle_bar の表示
    float angle_ratio;

    // 小計のカウンタ
    kcount= -1;

    // kizami は、測定数: jcount を何個ごとにデータ再格納したらよいかの、刻み値
    kizami = round(jcount/10+0.5);

    int i=0;

    while ( i <= jcount) {
        angle_max_temp =0;

        for (int j=0; j <kizami; j++){
            if (abs(angle_max_temp) < fabsf(angle_ar[i+j])) {
                angle_max_temp = angle_ar[i+j];}
        }

        kcount = kcount +1;
        angle_disp[kcount] = angle_max_temp;

        i= i+kizami;
    }

    angle_disp[9] =(angle_ar[jcount-3] + angle_ar[jcount-2] + angle_ar[jcount-1]) /3;

    UIGraphicsBeginImageContext(_Image_View.frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();  // コンテキストを取得

    self.judge_Label.textColor = [UIColor blackColor];    // "黒"
    self.judge_Label.text = @"";

    // 傾斜角度の初期化
 // 中略
    angle_R = 0;
    angle_L = 0;

    // angle_bar もリセットする spineのみにする

    self.x1.transform = CGAffineTransformMakeScale(0, 0);
// 中略

    for (i=0; i<10; i++) {
        angle_ref = angle_disp[i];
        angle_ratio =  fabs(angle_ref / 10.0);

        if (angle_ratio > 0.99) {angle_ratio =1.0; }
        if (angle_ratio < -0.99) {angle_ratio =-1.0; }

    switch (i+1) {
        case 1:
            if (angle_ref == 0 ){
                self.R10.text =[NSString stringWithFormat:@"%d",angle_ref * 0];
                self.L10.text =[NSString stringWithFormat:@"%d",angle_ref * 0];

                // 白バーできれいに
                CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0); // 枠色: 白
                CGContextMoveToPoint(context, y10_x, y10_y+5); // 始点
                CGContextAddLineToPoint(context, y10_x+110, y10_y+5); // 終点
                CGContextSetLineWidth(context,12); // 線幅
                CGContextStrokePath(context); // 線描画
            }

            // 角度:正 被検者の左サイド 右バー
            else if (angle_ref > 0 ){
                // 白バーできれいに
                CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0); // 枠色: 白
                CGContextMoveToPoint(context, y10_x, y10_y+5); // 始点
                CGContextAddLineToPoint(context, y10_x+110, y10_y+5); // 終点
                CGContextSetLineWidth(context,12); // 線幅
                CGContextStrokePath(context); // 線描画

                if (abs(angle_ref) < bndry_1 ) {
                    CGContextSetRGBStrokeColor(context, 0, 0, 1, 1.0);} // 青
                else if (abs(angle_ref) >= bndry_1 && abs(angle_ref) < bndry_2){
                    CGContextSetRGBStrokeColor(context, 1, 1, 0, 1.0);}  // 黄色
                else if (abs(angle_ref) >= bndry_2 ) {
                    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1.0);} // 赤

                CGContextMoveToPoint(context, y10_x, y10_y+5); // 始点
                CGContextAddLineToPoint(context, y10_x+100*angle_ratio, y10_y+5); // 終点
                CGContextSetLineWidth(context,10); // 線幅
                CGContextStrokePath(context); // 線描画

                CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);// 枠色: 黒
                CGContextSetLineWidth(context,1); // 線幅
                CGRect r1 =CGRectMake(y10_x, y10_y, 100*angle_ratio, 10);
                CGContextAddRect(context, r1);
                CGContextStrokePath(context);  // 四角描画
                // TakeOne
                _Image_View.image = UIGraphicsGetImageFromCurrentImageContext();

                self.L10.text =[NSString stringWithFormat:@"%d",angle_disp[i]];}

            // 角度:負 被検者の右サイド 左バー
            else if (angle_ref < 0){

                // 白バーできれいに
                CGContextSetRGBStrokeColor(context, 1, 1, 1, 1.0); // 枠色: 白
                CGContextMoveToPoint(context, x10_x-2, x10_y+5); // 始点
                CGContextAddLineToPoint(context, x10_x+102, x10_y+5); // 終点
                CGContextSetLineWidth(context,12); // 線幅
                CGContextStrokePath(context); // 線描画

                if (abs(angle_ref) < bndry_1 ) {
                    CGContextSetRGBStrokeColor(context, 0, 0, 1, 1.0);} // 青
                else if (abs(angle_ref) >= bndry_1 && abs(angle_ref) < bndry_2){
                    CGContextSetRGBStrokeColor(context, 1, 1, 0, 1.0);}  // 黄色
                else if (abs(angle_ref) >= bndry_2 ) {
                    CGContextSetRGBStrokeColor(context, 1, 0, 0, 1.0);} // 赤

                CGContextMoveToPoint(context, x10_x+ 100, x10_y+5); // 始点
                CGContextAddLineToPoint(context, (x10_x+100) - (100*angle_ratio), x10_y+5); // 終点
                CGContextSetLineWidth(context,10); // 線幅
                CGContextStrokePath(context); // 線描画

                CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);// 枠色: 黒
                CGContextSetLineWidth(context,1); // 線幅
                CGRect r1 =CGRectMake(x10_x+ (100-fabsf(100*angle_ratio)), x10_y, fabsf(100*angle_ratio), 10);
                CGContextAddRect(context, r1);
                CGContextStrokePath(context);  // 四角描画
                _Image_View.image = UIGraphicsGetImageFromCurrentImageContext();

                self.R10.text =[NSString stringWithFormat:@"%d",angle_disp[i]];}
            break;

// 中略
    }
    // 計測値 angle_disp[] を調べて、左右の最大値を表示する場合 一時的対応

    angle_R =0;
    angle_L =0;

    for (int i=0; i <=9; i++) {       
        if (angle_disp[i] > angle_R) { angle_R = angle_disp[i] ;}
        if (angle_disp[i] < angle_L) { angle_L = angle_disp[i] ;}
    }

    self.R_Label.text = [NSString stringWithFormat:@"Lmax= %d", angle_R];
    self.L_Label.text = [NSString stringWithFormat:@"Rmax= %d", angle_L];

    // 傾斜角配列 angle_ar[] の中に bndry_1, bndry_2 以上の傾斜角の有無を調べ
    // bndry_2 ありなら、 赤字で 「専門医受診を強く、勧める。」
    // bndry_1 有りなら、赤字で「専門医受診を勧める」 無しなら、黒字で「正常範囲です」 と表示する

    int judge_count_1;
    int judge_count_2;

    judge_count_1 =0;
    judge_count_2 =0;

    for (int k=0; k <=jcount; k++) {

        // fabs : 絶対値を求める関数
        if (fabs(angle_ar[k]) >= bndry_1 && fabs(angle_ar[k]) < bndry_2) {
            judge_count_1++; }
        if (fabs(angle_ar[k]) >= bndry_2) {
            judge_count_2++; }

    if (judge_count_1 > 0) {
        self.judge_Label.textColor = [UIColor magentaColor];    // "マゼンタ"
        self.judge_Label.text = @"専門医の受診をお勧めします";}
    if (judge_count_2 > 0) {
        self.judge_Label.textColor = [UIColor redColor];    // "赤"
        self.judge_Label.text = @"専門医の受診を強くお勧めします!!";}
    if ( judge_count_1 == 0 && judge_count_2 == 0) {
        self.judge_Label.textColor = [UIColor blackColor];    // "黒"
        self.judge_Label.text = @"   正常範囲内です";}

    //angle_ar[] の初期化    
        for (i=0; i <500; i++) {angle_ar[i] = 0; } 
    // angle_disp[] 初期化
        for (i=0; i<10; i++) { angle_disp[i] = 0;}    
    // jcount の 初期化
    jcount =0;

        // stopボタンを押した時のタイマー停止処理
        [_timer invalidate];
        _timer = nil;

  // スクリーンショット
    [self erb_workaround02Snapshot];

}
}

- (UIImageView *)erb_workaround02Snapshot {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0f);   
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    return imageView;
}

コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

「無反応」というのはどういう意味ですか?

erb_workaround02Snapshotのメソッドを呼び出すところまで実行されないということですか?
それとも、そのメソッドは実行されているけど、その中のUIGraphicsGetImageFromCurrentImageContext()で意図したimageが取得されないということですか?
何をどこまで確認したか説明してください。

また、現在のコードは、取得したスクリーンショット(image)をimageViewに設定した上で戻り値として返却していますが、呼び出し元でそのimageViewを受け取らず捨てています。
その上「記録保存を目指している」と言いながらimageをファイルに保存する処理がないようですが、それはこれから実装予定ということですか?
今のコーディング状態でどんな動作を期待して質問しているのか説明してください。

それともそのファイル保存方法をこの質問で教えろと言っているですか?
でしたら、自分でどこまで調べてどこからわからないのか説明してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/26 14:47

    回答、ありがとうございます。
    画像追加しました。
    スクリーンショットのプログラムは実行されており、imageView にも、
    正しく、データは格納されているようです。
    ただ、これを、iPodtouch のアプリ「写真」に記録するのに

    //UIImageJPEGRepresentation(*imageView, 0.8f);

    // UIImageWriteToSavedPhotosAlbum(*imageView, nil, nil, nil);

    など使ってみましたが、エラーが出たり、画像が写真として記録されませんでした。
    引数の名前が違うのかもしれません。
    宜しくお願い致します。

    キャンセル

  • 2016/05/26 17:34

    写真ライブラリへの保存方法は、
    http://d.hatena.ne.jp/yoheiM/20110216
    等、ネットを探せばわかりやすい例がいくつもあると思うのですが、
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    でimageを取得できたら、あとはそれを
    UIImageWriteToSavedPhotosAlbumの第1パラメータに指定して保存するだけです。
    第1パラメータに指定するものはimageViewではありませんし、第2,第3パラメーターには保存完了通知をもらうためのメソッドを指定する必要があります。保存するだけならimageViewを作成する必要はありません。
    ネットで色々サンプルを見つけてはいるのだと思いますが、それを見ても自分のアプリに組み込む方法がわからないということは、基礎の理解ができてないまま意味もわからず見よう見まねでやっているのではないかと思います。一度入門書を読んできちんと基礎を身につけることをお勧めします。
    正直、このレベルの質問は、やり方がわからないと丸投げしているのに近く、本来このサイトが目的としているようなプログラミングの問題を解決する以前の勉強不足の話だと捉えかねられません。

    キャンセル

  • 2016/05/27 16:40

    回答、ありがとうございます。
    数冊のマニュアル本を参考に、UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); にしたところ、アルバムに写真として、記録されていました。
    (計測時間の短縮もあり、今回は、自分なりにこれでよしとしたいと思います。のちほど、改良するかもしれませんが)
     基礎の理解が未熟のまま、締め切りに追われるあまり、TakeOne 様はじめ皆さんに甘えながら、ここまで来てしまいました。 今後は、改善していきたいと思います。 ありがとうございました。

    --------------------------------------------------------------------------------------------
    - (UIImageView *)erb_workaround02Snapshot {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0.0f);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    return imageView;
    }
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る