使用以下代码显示相机的垂直预览,它的工作原理.. 但!!我在风景中得到了一张照片! :(
我如何垂直构建它? 我在垂直方向上有预览视图,但我无法垂直保存图片。
问候和谢意, 弗兰ONCLICK
public void onClick(View arg0) {
camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
}
预览
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (previewing) {
camera.stopPreview();
previewing = false;
}
if (camera != null) {
/*
* camera.setPreviewDisplay(surfaceHolder); camera.startPreview();
* previewing = true;
*/
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
// Condicions per utilitzar la orientacio adecuada segons el sdk
if (Integer.parseInt(Build.VERSION.SDK) >= 8)
setDisplayOrientation(camera, 90);
else {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
parameters.set("orientation", "portrait");
parameters.set("rotation", 90);
}
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "landscape");
parameters.set("rotation", 90);
}
camera.setParameters(parameters);
}
// camera.startPreview();
previewing = true;
}
}
拍摄照片
PictureCallback myPictureCallback_JPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// intentar canvia horientacio
Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
//bitmapPicture.
OutputStream imageFileOS;
try {
imageFileOS = new FileOutputStream(String.format("/sdcard/DCIM/iboo/captura.jpg"));
imageFileOS.write(arg0);
imageFileOS.flush();
imageFileOS.close();
// Missatge en cas de capturar l'imatge correctament
Toast.makeText(Principal.this, "Imatge Capturada!",
Toast.LENGTH_LONG).show();
MostrarFoto("/sdcard/DCIM/iboo/captura.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// camera.startPreview();
}
};
答案 0 :(得分:7)
这是我实施的解决方案。它完美地运作。我希望有所帮助。
PictureCallback myPictureCallback_JPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 6;
options.inDither = false; // Disable Dithering mode
options.inPurgeable = true; // Tell to gc that whether it needs free
// memory, the Bitmap can be cleared
options.inInputShareable = true; // Which kind of reference will be
// used to recover the Bitmap
// data after being clear, when
// it will be used in the future
options.inTempStorage = new byte[32 * 1024];
options.inPreferredConfig = Bitmap.Config.RGB_565;
bMap = BitmapFactory.decodeByteArray(arg0, 0, arg0.length, options);
// others devices
if(bMap.getHeight() < bMap.getWidth()){
orientation = 90;
} else {
orientation = 0;
}
Bitmap bMapRotate;
if (orientation != 0) {
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(),
bMap.getHeight(), matrix, true);
} else
bMapRotate = Bitmap.createScaledBitmap(bMap, bMap.getWidth(),
bMap.getHeight(), true);
FileOutputStream out;
try {
out = new FileOutputStream(
String.format("/sdcard/DCIM/test/screen.jpg"));
bMapRotate.compress(Bitmap.CompressFormat.JPEG, 90, out);
if (bMapRotate != null) {
bMapRotate.recycle();
bMapRotate = null;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.startPreview();
MostrarFoto(imageInSD);
editor = prefs.edit();
editor.putString("PathSeleccio", imageInSD);
editor.commit();
}
};
答案 1 :(得分:1)
Camera.Parameters param;
param = camera.getParameters();
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0)
{
camera.setDisplayOrientation(90);
param.setRotation(90);
}
if(display.getRotation() == Surface.ROTATION_270)
{
camera.setDisplayOrientation(180);
param.setRotation(180);
}
camera.setParameters(param);
camera.takePicture(shutterCallback, rawCallback, jpegCallback);
答案 2 :(得分:0)
使用以下代码设置图像的方向:
Matrix mat = new Matrix();
mat.postRotate(90);
image_to_upload = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(), myImage.getHeight(), mat, true);
答案 3 :(得分:0)
您实际上不需要旋转位图。这是内存消耗/慢速等...看起来你的情况下更好(保存到文件后立即更新){}更新Exif tags in a JPEG file,例如:
int degrees = 90;
ExifInterface exif = new ExifInterface(path);
exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(degrees));
exif.saveAttributes();