2

私のビジネスアプリには、ユーザーがUIView指で署名を描画して保存し(ツールバーのボタンをクリックして)、ユニットに添付できるようにする機能が必要です。これらのユニットは、作業が終了するとサーバーにアップロードされ、Base64経由でアップロードされたカメラ画像の添付ファイルをすでにサポートしているため、取得した署名をに変換したいだけですUIImage

まず、署名を描画するためのソリューションが必要でした。要件を満たしていると思われるAppleのサンプルコードをすぐに見つけました:GLPaint

ARCとストーリーボードを使用していて、効果音やカラーパレットなどが必要なかったため、このサンプルコードを少し変更してプロジェクトに統合しましたが、描画コードはストレートコピーです。

ビューに署名を描くことができたので、統合は成功したように見えました。したがって、次のステップは、描画された署名の保存/画像変換機能を追加することでした。

私は無限の検索を行い、同様の問題が尋ねられた数十のスレッドをロールバックしましたが、それらのほとんどはまったく同じ解決策を示していました:

(仮定)

  • drawingViewUIView描画が行われる場所でサブクラス化されています。)
  • <QuartzCore/QuartzCore.h>QuartzCore.framework含まれています
  • CoreGraphics.framework含まれています
  • OpenGLES.framework含まれています

    - (void) saveAsImage:(UIView*) drawingView
    {
        UIGraphicsBeginImageContext(drawingView.bounds.size);
        [drawingView.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentContext();
        UIGraphicsEndImageContext();
    }
    

最後に私の問題:このコードは常に空白の画像を返すため、私には機能しません。私はすでにiPhoneカメラで撮影した写真の添付ファイルのサポートを統合しているので、最初は画像処理コードが署名画像でも機能するはずだと思いました。

しかし..いくつかの結果のない検索の後、私はその仮定を捨て、元のGLPaintプロジェクトを取り、上記の数行と画像を表示するだけのコードを追加しましたが、これも完全に空白でした。したがって、それは、そのコードがの自己描画コンテンツで機能しないという問題か、UIView私が見逃しているもののいずれかです。

私は基本的にこの問題についての考えがなく、何人かの人々が私を助けてくれることを願っています。

よろしくフェリックス

4

1 に答える 1

1

あなたの問題は、GLコンテキストから画像を取得しようとしている可能性があると思います。Webでそれを検索することもできますが、通常、必要なのは、すべての「描画」呼び出しが行われた後に「glReadPixels」を呼び出すことだけです。次のようなものが機能するはずです。

BOOL createSnapshot;
int viewWidth, viewHeigth;
if(createSnapshot) {
    uint8_t *iData = new uint8_t[viewHeigth * viewWidth * 4];
    glReadPixels(0, 0, viewWidth, viewHeigth, GL_RGBA, GL_UNSIGNED_BYTE, iData);

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, iData, (viewWidth * viewHeigth * 4), NULL);
    CGColorSpaceRef cref = CGColorSpaceCreateDeviceRGB();
    CGImageRef cgImage = CGImageCreate(viewWidth, viewHeigth, 8, 32, viewWidth*4, cref, kCGBitmapByteOrderDefault, provider, NULL, NO, kCGRenderingIntentDefault);

    UIImage *ret = [UIImage imageWithCGImage:cgImage scale:1.0f]; //the image you need

    CGImageRelease(cgImage);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(cref);
    delete [] iData;

    createSnapshot = NO;
}

マルチサンプリングを使用する場合は、バッファが解決され、提示フレームバッファがバインドされた後で、これを呼び出す必要があります。

于 2012-11-05T11:37:20.603 に答える