Autore Topic: Rettangolo guida per fotocamera  (Letto 572 volte)

Offline AR64SH

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Rettangolo guida per fotocamera
« il: 21 Maggio 2013, 21:15:05 CEST »
0
Ciao a tutti, ci sto uscendo pazzo e non ho trovato nulla di che. Probabilmente non sono in grado di usare le giuste chiavi di ricerca.
Ho un'app che disegna in una Surface la preview della fotocamera. Quest'app fa una scansione ocr. Vorrei creare un rettangolo guida che permetta di centrare adeguatamente il testo. Praticamente tutto intorno a questo rettangolo dovrebbe esserci un bordo nero, semitrasparente e al centro il rettangolo trasparente che fa vedere il testo. Questo rettangolo lo devo usare anche per ritagliare la foto.

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
Re:Rettangolo guida per fotocamera
« Risposta #1 il: 21 Maggio 2013, 23:52:29 CEST »
0
Per disegnare il rettangolo in overlay puoi agire come suggeriscono qui:
header - Android: Overlay on Android Camera Preview - Stack Overflow

Tuttavia, se ho capito bene le tue intenzioni, presumo ti convenga agire direttamente sulla view in cui viene visualizzata la preview della camera. Se hai seguito l'esempio fornito con Android SDK, dovresti avere una custom surfaceview che implementa SurfaceHolder.Callback. In questo caso, in surfaceCreated() aggiungi:

Codice (Java): [Seleziona]
public void surfaceCreated(SurfaceHolder holder) {

                camera = Camera.open();

                try {
                       
                        setWillNotDraw(false); //  <----  parte che potrebbe mancare
                       
                        /*
                        *               qui c'era tutta la pappardella per l'aquisizione,
                        *                tagliata per chiarezza... ^_^
                        */


                       
                } catch (IOException e) {
                       
                }
        }

Dopodiché puoi disegnare quello che vuoi in onDraw():

Codice (Java): [Seleziona]
@Override
        protected void onDraw(Canvas canvas) {

                Paint p = new Paint(Color.RED);
                Rect r = new Rect(x,y,w,h);
                canvas.drawRect(r, p);
           
        }

Beh, forse il rettangolo disegnato così non è la soluzione (meglio 4 linee, una per lato...), ma il metodo funziona!  :D

Offline AR64SH

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
Re:Rettangolo guida per fotocamera
« Risposta #2 il: 21 Maggio 2013, 23:56:59 CEST »
0
Grazie per la risposta. Non mi è ben chiaro la parte mancante cosa dovrebbe fare :\

Offline NanoAndroide

  • Utente junior
  • **
  • Post: 63
  • Respect: +3
    • Google+
    • Mostra profilo
    • MeToo
  • Dispositivo Android:
    GT-S5570
  • Play Store ID:
    MeToo
  • Sistema operativo:
    Windows 7
Re:Rettangolo guida per fotocamera
« Risposta #3 il: 22 Maggio 2013, 23:20:33 CEST »
0
Grazie per la risposta. Non mi è ben chiaro la parte mancante cosa dovrebbe fare :\

Dunque... per quanto riguarda 'public void setWillNotDraw (boolean willNotDraw)', ti rimando al sito di riferimento: View | Android Developers

La parte che ho tagliato, invece, è relativa al callback della camera. Riporto l'intera classe, grossomodo come l'ho usata in qualche esperimento (che poi è tratta dall'esempio 'ufficiale'):

Codice (Java): [Seleziona]
class Preview extends SurfaceView implements SurfaceHolder.Callback {

        SurfaceHolder mHolder;
        public Camera camera;

        Preview(Context context) {

                super(context);
                mHolder = getHolder();
                mHolder.addCallback(this);
                mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        }

        public void surfaceCreated(SurfaceHolder holder) {
               
                camera = Camera.open();

                try {

                        setWillNotDraw(false);    //  <--- la parte che potrebbe mancare

                        // quello che segue è quanto avevo tagliato prima...

                        camera.setPreviewDisplay(holder);

                        camera.setPreviewCallback(new PreviewCallback() {

                                public void onPreviewFrame(byte[] data, Camera arg1) {
                                        FileOutputStream outStream = null;
                                        try {
                                                outStream = new FileOutputStream(String.format(
                                                                "/sdcard/%d.jpg", System.currentTimeMillis()));
                                                outStream.write(data);
                                                outStream.close();
                                               
                                        } catch (FileNotFoundException e) {
                                                e.printStackTrace();
                                        } catch (IOException e) {
                                                e.printStackTrace();
                                        } finally {
                                        }
                                        Preview.this.invalidate();
                                }
                        });

                        // fine della parte tagliata...

                } catch (IOException e) {

                        e.printStackTrace();

                }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
               
                camera.stopPreview();
                camera = null;

        }

        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
               
                Camera.Parameters parameters = camera.getParameters();
                parameters.setPreviewSize(w, h);
                camera.setParameters(parameters);
                camera.startPreview();

        }

        @Override
        public void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                Paint p = new Paint(Color.RED);
               
                canvas.drawText("PREVIEW", canvas.getWidth() / 2,
                                canvas.getHeight() / 2, p);
        }
}

In poche parole, è la parte che si occupa di disegnare sulla surfaceview quanto ricevuto dalla camera. Ora non ricordo perchè l'avessi scritto così, trovi un approccio leggermente diverso (e forse più chiaro  :-P) negli esempi forniti con l'SDK ( \samples\android-8\ApiDemos\src\com\example\android\apis\graphics).