問題タブ [cgcontextdrawimage]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - CGContextDrawImage は、UIImage.CGImage を渡すと画像を上下逆に描画します
なぜCGContextDrawImage
私のイメージを上下逆さまに描くのか誰か知っていますか? アプリケーションから画像を読み込んでいます:
そして、コアグラフィックスにそれを私のコンテキストに描画するように依頼するだけです:
適切な場所と寸法でレンダリングされますが、画像は上下逆になっています。ここで本当に明白な何かが欠けているに違いありませんか?
calayer - レイヤーでのアルファ検出は、iPhone ではなくシミュレーターで OK
まず、SO の他の場所からCALayerへのこの非常に便利な拡張機能を確認してください。レイヤーのコンテンツに割り当てられたCGImageRefのポイントが透明か透明でないかを判断するのに役立ちます。
注意: レイヤがCGImageRefcontents
であるかのように表現可能または応答するという保証はありません。(これは、上記で参照されている拡張機能の広範な使用に影響を与える可能性があります。) ただし、私の場合、テストしているレイヤーにはCGImageRefが割り当てられていることがわかっています。(うまくいけば、これは配属後も私の下から変わることはありません! さらに、それが保持されていることに気付きました。)contents
contents
さて、当面の問題に戻りましょう。拡張機能の使用方法は次のとおりです。まず、セレクターを からcontainsPoint:
に変更しましたcontainsNonTransparentPoint:
(元のメソッドを維持する必要があります)。
これで、 7 つのCALayerオブジェクトを使用するUIImageViewサブクラスができました。これらは、不透明度ベースのアニメーション (パルス/グロー効果およびオン/オフ状態) に使用されます。これらの 7 つのレイヤーのそれぞれに既知のCGImageRefがあり、ビュー全体の一部を独自の色帯で効果的に「カバー」(エア クォート) します。それぞれのレイヤー内の各画像の残りの部分は透明です。contents
サブクラスでは、シングル タップ ジェスチャを登録します。1 つが到着すると、レイヤーを調べて、効果的にタップされたレイヤー (つまり、タップした場所が不透明なポイントがあり、最初に見つかったレイヤーが勝つ) を確認してから、必要なことを何でも実行できます。
ジェスチャを処理する方法は次のとおりです。
良いニュース?これらはすべて、iOS 4.3.2 の iPhone シミュレーターで美しく動作します。(FWIW、私は Xcode 4.1 を実行している Lion を使用しています。)
しかし、私の iPhone 4 (iOS 4.3.3 を搭載したもの) では、それにさえ近づきません! 私のタップはどれも、私が期待するレイヤーのいずれとも一致しないようです。
1x1 ピクセル コンテキストに描画するときにCGContextSetBlendModeを使用するという提案を試みても、さいころはありません。
パイロットのエラーだといいのですが、何が違うのかはまだわかりません。タップにはパターンがありますが、識別できるものではありません。
おそらく、データ境界の問題があります。おそらく、y座標を画像の左下に反転する以外のことをしなければなりません。まだわかりません。
誰かが間違っている可能性があることに光を当てることができれば、私は最も感謝しています!
更新、2011 年 9 月 22 日:最初のあははの瞬間を獲得しました! 問題は Simulator-vs-iPhone ではありません。網膜対非網膜です!Retina 版を使用している場合、シミュレーターで同じ症状が発生します。おそらく、ソリューションは何らかの方法/形状/形式でのスケーリング (CTM?) を中心にしています。Quartz 2D Programming Guide は、「iOS アプリケーションはUIGraphicsBeginImageContextWithOptionsを使用する必要がある」ともアドバイスしています。私はここで解決策に非常に近いと感じています!
ios - CGContextDrawImageは、大きなUIImageが描画された後、非常に遅くなります
CGContextDrawImage(CGContextRef、CGRect、CGImageRef)は、UIImageをサポートするCGImageを描画する場合よりも、CoreGraphicsによって(つまり、CGBitmapContextCreateImageを使用して)作成されたCGImageを描画する場合に非常に悪いパフォーマンスを示すようです。このテスト方法を参照してください。
ですから、問題は、#1何がこれを引き起こしているのか、#2はそれを回避する方法、つまり、より高速なCGImageRefを作成する他の方法があるのかということだと思います。最初にすべてをUIImagesに変換できることに気付きましたが、それは非常に醜い解決策です。私はすでにCGContextRefをそこに置いています。
更新:これは小さな画像を描くときに必ずしも当てはまらないようですか?これは、大きな画像(つまりフルサイズのカメラ写真)を使用すると、この問題が増幅されるという手がかりになる可能性があります。640x480は、どちらの方法でも実行時間の点でかなり似ているようです
更新2:わかりました、それで私は何か新しいものを発見しました..それは実際にはパフォーマンスを変えているCGImageの裏付けではありません。2つのステップの順序をフリップフロップして、UIImageメソッドの動作を遅くすることができますが、「裸の」CGImageは超高速になります。あなたが2番目に実行するものはどれでもひどいパフォーマンスに苦しむようです。これは、CGBitmapContextCreateImageで作成した画像に対してCGImageReleaseを呼び出してメモリを解放しない限り、当てはまるようです。その後、UIImageでバックアップされたメソッドは高速になります。逆にそれは真実ではありません。何が得られますか?「混雑した」メモリは、このようなパフォーマンスに影響を与えるべきではありませんか?
更新3:話が早すぎた。以前の更新は、サイズ2048x2048の画像にも当てはまりますが、1936x2592(カメラサイズ)にステップアップすると、操作の順序やメモリの状況に関係なく、ネイキッドCGImageメソッドの速度が大幅に低下します。21MBの画像を効率的に処理できないのに対し、16MBの画像を効率的にするCGの内部制限があるかもしれません。2048x2048よりもカメラサイズの描画が文字通り20倍遅くなります。どういうわけか、UIImageは純粋なCGImageオブジェクトよりもはるかに高速にCGImageデータを提供します。oO
UPDATE 4:これはメモリキャッシュの問題に関係しているのではないかと思いましたが、UIImageが非キャッシュの[UIImage imageWithContentsOfFile]でロードされても、[UIImageimageNamed]が使用されている場合と同じ結果になります。
更新5(2日目):昨日回答されたよりもmroeの質問を作成した後、今日は何かしっかりしたものがあります。私が確かに言えることは次のとおりです。
- UIImageの背後にあるCGImageはアルファを使用しません。(kCGImageAlphaNoneSkipLast)。私のコンテキストはアルファを使用していたので、おそらくそれらはより速く描画されると思いました。そこで、kCGImageAlphaNoneSkipLastを使用するようにコンテキストを変更しました。これにより、次の場合を除いて、描画がはるかに高速になります。
- 最初にUIImageを使用してCGContextRefに描画すると、後続のすべての画像の描画が遅くなります
私はこれを1)最初に非アルファコンテキスト(1936x2592)を作成することによって証明しました。2)ランダムに色付けされた2x2の正方形で塗りつぶしました。3)そのコンテキストにCGImageを描画するフルフレームは高速(.17秒)でした。4)実験を繰り返しましたが、UIImageを裏付ける描画されたCGImageでコンテキストを埋めました。その後のフルフレーム画像の描画は6秒以上でした。SLOWWWWW。
どういうわけか、(大きい)UIImageを使用してコンテキストに描画すると、そのコンテキストへの後続のすべての描画が大幅に遅くなります。
ios - CGContext の奇妙さ
ユーザーが指でこのパネルに署名できるように、署名パネルと呼ばれる小さなコード モジュールがあります。すべてが iPad 上で実行されます。これで、通常の touchesBegan()、touchesMoved()、touchesEnded() カルーセルを実行して、そのパネルにサインさせることができました。署名するときは、メイン ビューに彼の署名を描きます。ただし、何らかの理由で、画像が 2 回表示されます。1 回目は正しく表示され、もう 1 回はメインの署名の上に上下逆さまになっています (画像を参照)。私のコードでは翻訳が行われていないので、コード全体が間違っているのではないかと思いますが、その理由はわかりません。ここで私が間違っていることを誰かが知っていますか?
iphone - iphone(CGGraphics)で線画を消す方法は?
私は描画のiPhoneアプリケーションに取り組んでいます.ユーザーは線を描くことができ、同様に削除することもできます.線や描画を削除する方法を誰かが助けてくれますか?
ドローのコード
core-graphics - 手書きのときに線の曲線を作成する方法
私はアプリを作成していて、一部では手書きを実装しようとしています。imageViewを使用して書き込みを行いました。これは保存され、PDFとしてサーバーに送信されます。touch begin、move、endを実装し、contextAddLineToPointを使用して、ユーザーがコンテンツを作成するときに行を作成できます。でも。文章は少し先のとがったもので、ユーザーが文章の方向を変えたとき、つまり手紙を書いたときに曲線を作成しようとしています。手書き認識を実装するのではなく、描画される線を滑らかにするためです。
配列で構成される「バッファ」を作成しました。これは、ユーザーがタッチを動かしたときに2つの中間点を保持します。次のように:
drawImageは、ところで書き込みに使用しているimageViewです。次に、タッチ移動に移動します。
}
ご覧のとおり、2つのポイントが保存されるたびに、それらの間に線を引きます。これにより、描画が少し難しくなり、線がさらに不規則になります。
誰かが問題を解決できますか?私はiOSのグラフィックスに非常に慣れていないので、適切なAPIを使用しているかどうか、imageViewを使用する必要があるかどうかさえわかりません。
よろしくお願いします
objective-c - Retinaディスプレイ用に補間でスケールアップしたUIImageを描画するにはどうすればよいですか?
アプリでウェブからいくつかの画像を読み込み、UIImagedrawImageを使用してそれらを描画します。Retinaディスプレイにも同じ画像を使い続けたいのですが、補間して滑らかにします。どうすればこれを達成できますか?
事前に2倍の解像度で(メモリに)保存するか、レンダリング時にスケーリングしても問題ないと思います。これは、レンダリング時間中にスケーリングするパフォーマンスにどの程度影響するかによって異なります。
iphone - CGContextClip 後の UIImage drawAtPoint
ABUITableViewCell を使用し、すべてのコンテンツを手動で描画します。また、CGContextClip を使用して角を丸くしますが、すべてうまく機能しますが、クリップ四角形の外側に別の画像を描画しようとすると、表示されませんでした。
NSString を描画するとき、CGContextSaveGState(context) 関数を使用すると、テキストが表示されます。しかし、イメージはそうではありません。
CGContextClip の後に画像を描画するには?
ios - iOS - CGContextDrawImage をキャッシュすることは可能ですか?
タイミング プロファイル ツールを使用して、時間の 95% が関数 CGContextDrawImage の呼び出しに費やされていることを確認しました。
私のアプリでは、スプライト マップから切り出されて画面に描画される重複画像が多数あります。CGContextDrawImage の出力を NSMutableDictionay にキャッシュできるかどうか疑問に思っていました。同じスプライトが再度要求された場合、クリッピングとレンダリングのすべての作業を再度実行するのではなく、キャッシュからプルすることができます。これは私が持っているものですが、私は成功していません:
定義
キャッシュへの追加
キャッシュされたスプライト をレンダリングする私の究極のキャッシュ目標である CGImage をレンダリングするより良い方法があるかもしれませんが、現時点では、キャッシュされた画像を正常にレンダリングすることを検討していますが、これは成功していません。
ios - 変換を使用してUIImageViewから画像を抽出する
マルチタッチベースの写真調整プログラムを作成しました。UIImageViewに写真が表示されると、ユーザーのタッチに応じて変換値が設定され、画像が拡大/縮小されます。マルチタッチを処理するコードを次に示します。
そのため、プログラムは元の写真を維持し、変換値を変更して微調整を表示します。最後に、元の画像と変換値を取得しました。UIImageViewを使用する限り、元の写真として.imageを設定し、微調整の結果として.transformを設定することで、微調整された画像を再現できます。ここで、微調整した画像を1つの画像に再描画するために、CGContextConcatCTMを使用して、描画画像に変換を適用してみます。
それから私は間違った画像を手に入れました、ほとんどの場合、結果は私が期待した画像からずれています。(変換を使用したUIImageViewで取得できるもの)このスイートなどを検索して、回転の解決策をいくつか見つけましたが、どのタイプの変換にも一般的な解決策はありません。一部のメカニズムは回転に対してのみ機能し、一部は拡張に対して機能するなどです。UIImageView変換とCGContextConcatCTMの軸の違いが問題の原因になっているようです。しかし、それについての情報は見つかりませんでした。論理的には、コアグラフィックスとUIViewオリジンは同じである必要があります。
誰かが私に一般的な解決策は何ですか?