47 votes

Comment puis-je régler l'appareil photo aperçu de la taille au carré de rapport d'aspect dans un carré SurfaceView (comme Instagram)

Je suis en train de développer ma propre activité de la caméra, mais j'ai un problème que je ne suis pas impossible à résoudre...

Ce que je veux, c'est quelque chose de très similaire à instagram de cadre de photo, et c'est ce que j'obtiens:

My image

Quand je devrais obtenir quelque chose comme ceci:

Instagram image

et...

My second image

quand je devrais obtenir quelque chose comme:

Instagram 2

Je pense que je suis maanaging la SurfaceView et de prévisualisation de la Caméra bien, seulement à l'aide de

Camera.Parameters parameters = camera.getParameters();
camera.setDisplayOrientation(90);

et Personnalisé SurfaceView:

public class SquaredSurfaceView extends SurfaceView {

private int width;
private int height;

public SquaredSurfaceView(Context context) {
    super(context);
}

public SquaredSurfaceView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SquaredSurfaceView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    width = MeasureSpec.getSize(widthMeasureSpec);
    height = width;
    setMeasuredDimension(width, width);
}

public int getViewWidth() {
    return width;
}

public int getViewHeight() {
    return height;
}

}

Ce que je fais mal?? :-(

19voto

xramos Points 88

Comme l'a dit avant vous avez besoin pour trouver la bonne taille de l'aperçu (l'une avec un ratio d'aspect 1:1) et probablement vous devez utiliser FrameLayout pour la SurfacePreview. Il semble que vous avez et le ratio d'aspect de problème peut-être vous avez le droit d'aperçu taille, mais vous placer dans une mise en page incorrecte.

Une autre solution pourrait être (comme Instagram) pour faire de votre appareil photo en taille réelle, puis masquer certaines zones de la layour juste pour la faire ressembler à un carré. Puis par le logiciel, vous devez couper l'image pour en faire une vraie place.

Espérons que cela vous aide

7voto

Ycastan Points 21

La solution qui fonctionne pour moi est la 2ème Réponse, mais parce que nous avons besoin pour faire pivoter la caméra de 90 ° est nécessaire de changer la LARGEUR, la HAUTEUR, quelque chose comme ça...

   camera.setDisplayOrientation(90);
   Camera.Parameters params= camera.getParameters();
   surfaceView.getLayoutParams().width=params.getPreviewSize().height;
   surfaceView.getLayoutParams().height=params.getPreviewSize().width;

Espérons que cette solution vous aide!! :D

-1voto

shailesh Points 368

Vous pouvez l'utiliser pour obtenir pictureSize:

public static void initialCameraPictureSize(Context context, android.hardware.Camera.Parameters parameters) {

    List list = parameters.getSupportedPictureSizes();
    if(list != null) {
        android.hardware.Camera.Size size = null;
        Iterator iterator = list.iterator();
        do {
            if(!iterator.hasNext())
                break;
            android.hardware.Camera.Size size1 = (android.hardware.Camera.Size)iterator.next();
            if(Math.abs(3F * ((float)size1.width / 4F) - (float)size1.height) < 0.1F * (float)size1.width && (size == null || size1.height > size.height && size1.width < 3000))
                size = size1;
        } while(true);
        if(size != null)
            parameters.setPictureSize(size.width, size.height);
        else
            Log.e("CameraSettings", "No supported picture size found");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X