| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.media.cts; |
| |
| import android.content.Context; |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.graphics.Canvas; |
| import android.graphics.Color; |
| import android.graphics.Paint; |
| import android.graphics.PointF; |
| import android.graphics.Rect; |
| import android.media.FaceDetector; |
| import android.media.FaceDetector.Face; |
| import android.view.View; |
| |
| import java.util.ArrayList; |
| |
| public class FaceView extends View { |
| private static final int NUM_FACES = 10; |
| private FaceDetector mFaceDetector; |
| private Face[] mAllFaces = new Face[NUM_FACES]; |
| private Bitmap mSourceImage; |
| private Paint mTmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG); |
| private Paint mPOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG); |
| private Paint mPInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG); |
| private int mPicWidth; |
| private int mPicHeight; |
| |
| public ArrayList<Face> detectedFaces = new ArrayList<Face>(); |
| |
| public FaceView(Context context, int resId) { |
| super(context); |
| |
| mPInnerBullsEye.setStyle(Paint.Style.FILL); |
| mPInnerBullsEye.setColor(Color.RED); |
| |
| mPOuterBullsEye.setStyle(Paint.Style.STROKE); |
| mPOuterBullsEye.setColor(Color.RED); |
| |
| mTmpPaint.setStyle(Paint.Style.STROKE); |
| mTmpPaint.setTextAlign(Paint.Align.CENTER); |
| |
| BitmapFactory.Options bfo = new BitmapFactory.Options(); |
| bfo.inPreferredConfig = Bitmap.Config.RGB_565; |
| bfo.inScaled = false; |
| bfo.inDither = false; |
| |
| mSourceImage = BitmapFactory.decodeResource(getResources(), resId, bfo); |
| |
| mPicWidth = mSourceImage.getWidth(); |
| mPicHeight = mSourceImage.getHeight(); |
| |
| mFaceDetector = new FaceDetector(mPicWidth, mPicHeight, NUM_FACES); |
| int numFaces = mFaceDetector.findFaces(mSourceImage, mAllFaces); |
| |
| for (int i = 0; i < numFaces; i++) { |
| detectedFaces.add(mAllFaces[i]); |
| } |
| } |
| |
| @Override |
| protected void onDraw(Canvas canvas) { |
| float scale = Math.min((float) getWidth() / mPicWidth, (float) getHeight() / mPicHeight); |
| Rect scaledRect = new Rect(0, 0, mPicWidth, mPicHeight); |
| scaledRect.scale(scale); |
| canvas.drawBitmap(mSourceImage, null, scaledRect, mTmpPaint); |
| for (Face face : detectedFaces) { |
| PointF eyesMP = new PointF(); |
| face.getMidPoint(eyesMP); |
| float centerX = eyesMP.x * scale; |
| float centerY = eyesMP.y * scale; |
| float eyesDistance = face.eyesDistance() * scale; |
| mPOuterBullsEye.setStrokeWidth(eyesDistance / 6); |
| canvas.drawCircle(centerX, centerY, eyesDistance / 2, mPOuterBullsEye); |
| canvas.drawCircle(centerX, centerY, eyesDistance / 6, mPInnerBullsEye); |
| } |
| } |
| } |