9
votes

Capturation Zoomed Aperçu vue sur l'avexte

Je travaille avec la fonctionnalité de zoom dans la caméra AVFoundation, j'ai mis en place un zoom avant la vue de la vue AvcaptureVideoPreviewlayer. Maintenant, je veux capturer l'image zoomée.

Voici mon code pour ajouter AVFoundationVidePreviewlayer à voir: xxx

code pour zoomer vue de l'aperçu xxx

i Voulez-vous capturer cette image zoomée à partir de AperviewView

Merci d'avance.


0 commentaires

4 Réponses :


7
votes

Enfin, j'ai réussi à ajouter une photo zoomée de capture dans mon application. C'est un peu moche mais ça marche. J'ai utilisé UiImage + redimensionner le code du filet, puis a ajouté l'image pour zoomer, et la position de décalage calculée pour la région zoomée [qui est visible dans la vue de la caméra], puis je l'ai recadré.

Maintenant, mon application se bloque parfois lorsque l'échelle de zoom est à Max I.e. à 6x. Je reçois un problème de mémoire car l'image zoomée est trop grosse, je poserai cela comme une autre question.

En espérant que ce code pourrait être utile pour quelqu'un. xxx


2 commentaires

En ce qui concerne votre accident: simplement première récolte que de redimensionner pour résoudre votre problème de mémoire. Ne comprenez pas une grosse image si vous venez de déposer la plupart plus tard.


Je t'ai essayé de coder mais je ne pouvais pas comprendre le caméraille et le résultat final n'est toujours qu'une image vide. Pouvez-vous s'il vous plaît partager plus?



2
votes

Vous devriez essayer d'abord récolter, puis redimensionner, de cette façon, vous ne trouverez pas de problème de mémoire.

Qu'est-ce que vous faites maintenant, c'est comme: 600x600 L'image deviendra 3600x3600 lorsque 6x, puis vous le cultivez, cela donnera à nouveau 600x600. Mais, pourquoi n'essayez-vous pas 600x600 avec la récolte de 6x donne 100x100, puis redimensionnez-la à 600x600 à nouveau.

Il peut être possible que si la résolution d'origine est faible, l'image de sortie des deux processus diffère un peu, mais si la résolution d'origine est de 8MP / 5mp / 3mp (le plus élevé en 5/4s / 4 / 3G), la sortie sera presque similaire.

Ainsi, pour obtenir un meilleur résultat, utilisez-vous votre processus lorsque la résolution basse et pour une utilisation haute résolution inverse que j'ai suggéré ci-dessus.


0 commentaires

0
votes

J'ai pu accomplir d'abord les cultures d'abord, puis zoomer à l'aide de l'image graphique principale se transforme. Notez que nous conservons la taille de l'image d'origine et l'échelle de l'image dans le tampon d'image et effectuez la fonction de zoom complètement avec les opérations de transformation sur les pixels individuels. Notez que ce code ne prend pas en compte l'orientation du périphérique (dans mon cas, je n'utilise que le portrait de portrait actuellement), mais peut facilement être accompli avec une transformation de rotation supplémentaire:

UIGraphicsBeginImageContextWithOptions(imageSize,NO,1.0); // this will crop

CGContextRef context = UIGraphicsGetCurrentContext();


CGRect newRect = CGRectMake(0, 0, width, height);

// apply a scaling transform to zoom
// rotate about the center
// First we scale, then rotate, then translate
// actual matrix multiplication steps are applied in reverse when using
// right-handed coordinate system
// M' = M * translatation * rotation * scale
CGContextTranslateCTM(context, (width - scaledWidth)*0.5f,
                               (height-scaledHeight)*0.5f);
CGContextScaleCTM(context,scaleFactor,scaleFactor);

[sourceImage drawInRect:newRect];

newImage = UIGraphicsGetImageFromCurrentImageContext();
if (newImage == nil) {
    NSLog(@"could not scale image");
}

// pop the context to get back to the default
UIGraphicsEndImageContext();


0 commentaires

4
votes

Je limite l'échelle de l'image et la récolte directement avec: xxx

Il est censé fonctionner uniquement avec des connexions vidéo, mais pour une image fixe fonctionne aussi comme un charme.


1 commentaires

Cela devrait être la bonne réponse. Deux lignes de code et fonctionne parfaitement. Merci Jose!