iOS: Comment convertir le contenu auto-dessiné d'un UIView en image (une solution générale répandue renvoie une image vide)?

Mon application métier nécessite une fonctionnalité permettant à l'user de dessiner une signature sur un UIView avec son doigt et de l'save (via un clic sur la barre d'outils) afin de pouvoir l'associer à une unité. Ces unités seront téléchargées sur un server une fois le travail terminé et supporteront les pièces jointes d'images de camera téléchargées via Base64, donc je veux simplement convertir la signature prise en UIImage .

Tout d'abord, j'avais besoin d'une solution pour dessiner la signature, j'ai rapidement trouvé un exemple de code d'Apple qui semblait répondre à mes exigences: GLPaint

J'ai embedded cet exemple de code dans mon projet avec de légères modifications puisque je travaille avec ARC et Storyboards et que je ne voulais pas les effets sonores et la palette de colors etc., mais le code de dessin est une copy droite.

L'intégration a semblé être réussie puisque j'ai pu dessiner les signatures sur la vue. Donc, l'étape suivante consistait à append une fonction de sauvegarde / conversion d'image pour les signatures dessinées.

J'ai fait des searchs sans fin et roulé des dizaines de discussions avec des problèmes similaires posées et la plupart d'entre eux ont souligné la même solution:

(Hypothèses)

  • drawingView : UIView sous- UIView où le dessin est fait.)
  • <QuartzCore/QuartzCore.h> et QuartzCore.framework sont inclus
  • CoreGraphics.framework est inclus
  • OpenGLES.framework est inclus

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

Enfin mon problème: Ce code ne fonctionne pas pour moi car il renvoie toujours une image vide . Comme j'ai déjà embedded la prise en charge des pièces jointes sockets avec l'appareil photo de l'iPhone, j'ai d'abord supposé que le code de image processing devrait également fonctionner sur les images de la signature.

Mais après quelques searchs sans résultat, j'ai laissé tomber cette supposition, j'ai pris le projet original de GLPaint et j'ai juste ajouté les quelques lignes ci-dessus et du code qui montre juste l'image et il était aussi complètement vide. C'est donc un problème avec ce code qui ne fonctionne pas sur le contenu UIView sur UIView ou tout ce qui me manque.

Je suis fondamentalement à court d'idées sur cette question et j'espère que certaines personnes pourront m'aider.

Cordialement Félix

Je crois que votre problème pourrait être que vous essayez d'get une image du context GL. Vous pouvez searchr sur le Web pour cela, mais généralement tout ce dont vous avez besoin est d'appeler "glReadPixels" après tous les appels "draw" ont été faites .. Quelque chose comme ça devrait fonctionner:

 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; } 

Si vous utilisez le multi-échantillonnage, vous devrez l'appeler après que les tampons ont été résolus et que le tampon de trame a été lié.