2013-06-02 4 views
1

я следующий код для вывода изображения на пользователей экран с прямоугольником вокруг лица:Как масштабировать пользовательский вид на различных устройствах

public class AndroidFaceDetector extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.main); 
     setContentView(new myView(this)); 
    } 

    private class myView extends View { 

     private int imageWidth, imageHeight; 
     private int numberOfFace = 5; 
     private FaceDetector myFaceDetect; 
     private FaceDetector.Face[] myFace; 
     float myEyesDistance; 
     int numberOfFaceDetected; 

     Bitmap myBitmap; 

     public myView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 

      BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
      BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; 

      myBitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/face.jpg", BitmapFactoryOptionsbfo); 

      imageWidth = myBitmap.getWidth(); 
      imageHeight = myBitmap.getHeight(); 
      myFace = new FaceDetector.Face[numberOfFace]; 
      myFaceDetect = new FaceDetector(imageWidth, imageHeight, 
        numberOfFace); 
      numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 

     } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      // TODO Auto-generated method stub 

      canvas.drawBitmap(myBitmap, 0, 0, null); 

      Paint myPaint = new Paint(); 
      myPaint.setColor(Color.GREEN); 
      myPaint.setStyle(Paint.Style.STROKE); 
      myPaint.setStrokeWidth(3); 

      for (int i = 0; i < numberOfFaceDetected; i++) { 
       Face face = myFace[i]; 
       PointF myMidPoint = new PointF(); 
       face.getMidPoint(myMidPoint); 
       myEyesDistance = face.eyesDistance(); 
       canvas.drawRect((int) (myMidPoint.x - myEyesDistance), 
         (int) (myMidPoint.y - myEyesDistance), 
         (int) (myMidPoint.x + myEyesDistance), 
         (int) (myMidPoint.y + myEyesDistance), myPaint); 
      } 
     } 
    } 
} 

Он отображает следующие на моем Sony Ericsson x8:

x8 screenshot

Вот дисплей на Xperia сони:

enter image description here

Кто-нибудь знает, как масштабировать изображение, чтобы оно соответствовало экрану любого устройства? Благодаря !

Update Я попытался следующие, но это не работает:

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    DisplayMetrics metrics=new DisplayMetrics(); 

    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    height=metrics.heightPixels/metrics.xdpi; 
    width=metrics.widthPixels/metrics.ydpi; 
    // setContentView(R.layout.main); 
    setContentView(new myView(this)); 
} 

@Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 

     canvas.drawBitmap(myBitmap, 0, 0, null); 

     Paint myPaint = new Paint(); 
     myPaint.setColor(Color.GREEN); 
     myPaint.setStyle(Paint.Style.STROKE); 
     myPaint.setStrokeWidth(3); 

     for (int i = 0; i < numberOfFaceDetected; i++) { 
      Face face = myFace[i]; 
      PointF myMidPoint = new PointF(); 
      face.getMidPoint(myMidPoint); 
      myEyesDistance = face.eyesDistance(); 
      canvas.drawRect((int) (myMidPoint.x - myEyesDistance), 
        (int) (myMidPoint.y - myEyesDistance), 
        (int) (myMidPoint.x + myEyesDistance), 
        (int) (myMidPoint.y + myEyesDistance), myPaint); 
     } 


     canvas.scale(width, height); 
    } 
} 

ответ

1

При рисовании растрового изображения, используйте Bitmap.createScaledBitmap для масштабирования растрового изображения в ширину и высоту вашего вида. Тогда это подойдет. Удостоверьтесь, что точки на растровом изображении не совпадают - используйте либо позицию в исходном растровом изображении, либо масштабированное растровое изображение, не смешивайте и не сопоставляйте, или вы получите нечетные результаты.

2

Масштаб холста, прежде чем рисовать на нем.

http://developer.android.com/reference/android/graphics/Canvas.html#scale(float,%20float)

Edit: Или создать новый растровое изображение как упоминает Гейб. На современных устройствах, поддерживающих масштабирование аппаратного ускорения с использованием метода холста, во время работы чрезвычайно дешево, но сохранение большего растрового изображения в памяти будет потреблять больше памяти, чем сохранение меньшей версии. Если вам уже необходимо сохранить версию с полным разрешением в памяти по какой-то другой причине, масштабирование ее при рисовании будет более эффективным для новых устройств. Если вам больше не нужна версия с полным разрешением, создание масштабированного растрового изображения и отбрасывание оригинала будет использовать меньше памяти, если исходное изображение было больше.

+0

Как я могу определить, сколько его можно масштабировать? Я обновляю свой вопрос тем, что я пробовал, но это не сработало. – TomSelleck

+0

Масштабируйте его по view.getWidth()/bitmap.getWidth() в x и view.getHeight()/bitmap.getHeight() в y. –

2
DisplayMetrics metrics=new DisplayMetrics(); 

getWindowManager().getDefaultDisplay().getMetrics(metrics); 
float height=metrics.heightPixels/metrics.xdpi; 
float width=metrics.widthPixels/metrics.ydpi; 
canvas.drawRect(0, 0, width, height, paint); 
Смежные вопросы