La conversion d'aperçu d'image bitmap
Je sais que le sujet a été sur le conseil d'administration de nombreuses fois, mais je ne peux pas le faire fonctionner, de toute façon...
Je veux sauvegarder visualiser des images à partir de l'aperçu pour les fichiers jpeg. Il semble plus ou moins(le code est simplifié - sans logique supplémentaire, à l'exception etc) comme ça...
public void onPreviewFrame(byte[] data, Camera camera) {
int width = camera.getParameters().getPreviewSize().width;
int height = camera.getParameters().getPreviewSize().height;
final int[] rgb = decodeYUV420SP(data, width, height);
Bitmap bmp = Bitmap.createBitmap(rgb, width, height,Bitmap.Config.ARGB_8888);
String filename="/sdcard/file" + (index++)+ ".jpg";
FileOutputStream out;
out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
out=null;
}
Ici est l'une des méthodes que j'ai essayé de convertir les couleurs(à partir de ce conseil, je crois)
public int[] decodeYUV420SP( byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
int rgb[]=new int[width*height];
for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0) y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);
if (r < 0) r = 0; else if (r > 262143) r = 262143;
if (g < 0) g = 0; else if (g > 262143) g = 262143;
if (b < 0) b = 0; else if (b > 262143) b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) &
0xff00) | ((b >> 10) & 0xff);
}
}
return rgb;
}
Le problème est que l'image semble toujours comme trois étranges vert des photos"...
J'ai ama nouvel utilisateur donc je ne peux pas le poster:(
Je ne sais pas si elle a quelque chose à voir avec la taille ou quoi, mais je suis coincé...
Pouvez-vous me soutenir?
OriginalL'auteur androdevo | 2011-01-22
Vous devez vous connecter pour publier un commentaire.
Alternativement, si vous NE besoin d'un bitmap pour une raison quelconque, et/ou qui veulent le faire sans la création d'un YUVImage et la compression pour le format JPEG, vous pouvez utiliser la pratique RenderScript 'ScriptIntrinsicYuvToRGB' API (17+):
Je suppose que pour le " r " est la largeur/hauteur vous pouvez obtenir en appelant
camera.getParameters().getPreviewSize().width
etc.OriginalL'auteur Tim
Un simple enregistrement au format jpeg est une tâche plus facile que de convertir bitmap, pas besoin YUV décodage de code grâce à
YuvImage
classe.OriginalL'auteur weston
Si je ne me trompe pas, vous voulez que la largeur et la hauteur de l'image à décoder, pas la largeur et la hauteur de la fenêtre d'aperçu.
OriginalL'auteur sschrass
Afin d'éviter les dégradés de l'image JPEG sur la sortie (par ex. avec de l'entrelacement vert/rouge spots), vous devez rincer et près FileOutputStream
OriginalL'auteur Marko
que j'ai découvert la largeur et la hauteur de lire à partir de PreviewSize avaient tort....
En d'autres termes, la conversion s'est mal passé parce qu'elle était basée sur de fausses valeurs.
Après l'utilisation d'un nouveau mode de réglage de l'aperçu des paramètres(à partir de l'exemple deleivered par google) tout fonctionne bien.
EDIT:
Désolé pour la réponse rapide, au-dessus et à long retard.
C'était tout à l'heure et je ne peux pas creuser le code maintenant, mais je pense que j'ai utilisé:
http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupportedPreviewSizes()
et a pris le premier élément de la liste et définissez les valeurs par
http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPreviewSize(int, int)
j'ai stocké la largeur et la hauteur et l'a utilisé pour transformer l'image.
Il ne sais pas si c'était la meilleure solution, mais ça a fonctionné.
Quel était l'autre méthode?
C'est non informative répondre
Il est instructif. Lorsque vous setPreviewSize de valeur qui n'est pas pris en charge, il semble produire de déchets.
C'était en effet utile pour moi, merci 🙂
OriginalL'auteur androdevo