दिलचस्प पोस्ट
लोहे राउटर या उल्का का उपयोग कर फाइल कैसे सेवा करें? क्या यह विभिन्न कार्यों में काम चलाने के लिए Gulp को झंडा देना संभव है? .NET में NameValueCollection में किसी क्वेरी स्ट्रिंग को कैसे विश्लेषित करें विधि नाम और पंक्ति संख्या को कैसे मुद्रित करें और NSLog को सशर्त अक्षम करें? संचालकों को तार के रूप में सी – "चार var " और "चार * var" के बीच का अंतर? मैं आईओआरएएम के भीतर DOM तत्वों तक कैसे पहुंच सकता हूं jqGrid और गतिशील कॉलम बाइंडिंग बाकी संसाधन यूआरएल में क्वेरीज़ यह देखने के लिए कैसे जांच करें कि क्या मान एक MySQL में पूर्णांक है? कॉलिंग फॉर्म से संवाद WPF बनाम सिल्वरलाइट जावा में एक "सरोगेट जोड़ी" क्या है? पहला मैच रोकने के लिए नियमित अभिव्यक्ति मैं कैसे एक अपवाद (न सिर्फ परीक्षण के लिए) एक numpy चेतावनी पकड़ है?

Android में कैमरा ओरिएंटेशन समस्या

मैं एक ऐसे आवेदन का निर्माण कर रहा हूं जो चित्र लेने के लिए कैमरा का उपयोग करता है ऐसा करने के लिए मेरा स्रोत कोड है:

File file = new File(Environment.getExternalStorageDirectory(), imageFileName); imageFilePath = file.getPath(); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(intent, ACTIVITY_NATIVE_CAMERA_AQUIRE); 

onActivityResult() विधि पर, मैं छवि को पिकअप करने के लिए BitmapFactory.decodeStream() का उपयोग करता BitmapFactory.decodeStream()

जब मैं नेक्सस वन पर अपना आवेदन चलाता हूं, तो यह अच्छी तरह से चलता है। लेकिन जब मैं सैमसंग गैलेक्सी एस या एचटीसी इंस्प्रर 4 जी पर चलता हूं, तो छवि की दिशा सही नहीं है।

  • पोर्ट्रेट मोड के साथ कब्जा, असली छवि (एसडी कार्ड पर सहेजें) हमेशा 90 डिग्री घूमता है

शॉट के बाद छवि पूर्वावलोकनएसडी कार्ड पर असली छवि

शॉट के बाद छवि पूर्वावलोकन ——— एसडी कार्ड पर वास्तविक छवि

  • परिदृश्य मोड के साथ कब्जा, सभी चीजें अच्छे हैं

शॉट के बाद छवि पूर्वावलोकनएसडी कार्ड पर वास्तविक छवि

शॉट के बाद छवि पूर्वावलोकन ——— एसडी कार्ड पर वास्तविक छवि

वेब के समाधान से एकत्रित समाधान "Android में कैमरा ओरिएंटेशन समस्या"

यहां लगभग कुछ समान विषयों और मुद्दे हैं। चूंकि आप अपना खुद का कैमरा नहीं लिख रहे हैं, मुझे लगता है कि इसे नीचे फोड़ा है:

कुछ डिवाइस इसे सहेजने से पहले छवि को घुमाने के लिए, जबकि अन्य केवल फोटो के एक्स्ट डेटा में अभिविन्यास टैग को जोड़ते हैं।

मैं तस्वीर के एक्सआईफ़ डेटा की जांच करने और विशेष रूप से देखने की सिफारिश करता हूं

 ExifInterface exif = new ExifInterface(SourceFileName); //Since API Level 5 String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

चूंकि तस्वीर आपके ऐप में सही ढंग से प्रदर्शित हो रही है, मुझे यकीन नहीं है कि समस्या कहां है, लेकिन इससे आपको सही रास्ते पर निश्चित रूप से सेट किया जाना चाहिए!

मुझे एक ही समस्या का सामना करना पड़ा, और उन्मुखीकरण को ठीक करने के लिए इसका इस्तेमाल किया गया:

 public void fixOrientation() { if (mBitmap.getWidth() > mBitmap.getHeight()) { Matrix matrix = new Matrix(); matrix.postRotate(90); mBitmap = Bitmap.createBitmap(mBitmap , 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), matrix, true); } } 

यदि बिटमैप की चौड़ाई ऊँचाई से अधिक है, तो लौटा चित्र परिदृश्य में है, इसलिए मैं इसे 90 डिग्री में घुमाएगा

उम्मीद है कि इस मुद्दे के साथ किसी और को मदद मिलेगी

दो चीजें जरूरी हैं:

  1. कैमरा पूर्वावलोकन को आपके रोटेशन के समान होना चाहिए। यह camera.setDisplayOrientation(result); द्वारा सेट करें camera.setDisplayOrientation(result);

  2. अपने कैमरा पूर्वावलोकन के रूप में कब्जा कर लिया गया चित्र सहेजें यह Camera.Parameters माध्यम से Camera.ParametersCamera.Parameters

     int mRotation = getCameraDisplayOrientation(); Camera.Parameters parameters = camera.getParameters(); parameters.setRotation(mRotation); //set rotation to save the picture camera.setDisplayOrientation(result); //set the rotation for preview camera camera.setParameters(parameters); 

उम्मीद है की वो मदद करदे।

  int rotate = 0; try { File imageFile = new File(sourcepath); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } } catch (Exception e) { e.printStackTrace(); } Matrix matrix = new Matrix(); matrix.postRotate(rotate); bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 

एक अन्य विकल्प इस तरह से परिणाम स्क्रीन में बिटमैप को घुमाएगा:

 ImageView img=(ImageView)findViewById(R.id.ImageView01); Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.refresh); // Getting width & height of the given image. int w = bmp.getWidth(); int h = bmp.getHeight(); // Setting post rotate to 90 Matrix mtx = new Matrix(); mtx.postRotate(90); // Rotating Bitmap Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); BitmapDrawable bmd = new BitmapDrawable(rotatedBMP); img.setImageDrawable(bmd); 

मेरे पास कुछ डिवाइस के लिए भी यही समस्या है:

 private void rotateImage(final String path) { Bitmap scaledBitmap = Bitmap.createScaledBitmap(Conasants.bm1, 1000, 700, true); Bitmap rotatedBitmap = null; try { ExifInterface ei = new ExifInterface(path); int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); Matrix matrix = new Matrix(); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: matrix.postRotate(90); rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); break; case ExifInterface.ORIENTATION_ROTATE_180: matrix.postRotate(180); rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); break; case ExifInterface.ORIENTATION_ROTATE_270: matrix.postRotate(270); rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); break; default: rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); break; } } catch (Throwable e) { e.printStackTrace(); } cropImage.setImageBitmap(rotatedBitmap); rotatedBitmap = null; Conasants.bm1 = null; } 

फोटो के एक्सआईफ़ डेटा की जाँच नहीं करें ग्लाइड के साथ आसान हो जाओ।

Google ने Google द्वारा अनुशंसित एक लाइब्रेरी के रूप में ग्लाइड नामित बम्पटेक द्वारा विकसित Android के लिए एक छवि लोडर लाइब्रेरी की शुरुआत की है। अब तक कई Google ओपन सोर्स परियोजनाओं में इसका उपयोग Google I / O 2014 आधिकारिक आवेदन सहित किया गया है।

पूर्व: ग्लाइड.सह (संदर्भ) .लोड (यूरी) .इनटो (छविदृश्य);

अधिक के लिए: https://github.com/bumptech/glide

इस तरह से कोशिश करो: स्थिर Uri image_uri; स्थैतिक बिटमैप लिया_आईमेज = नल;

  image_uri=fileUri; // file where image has been saved taken_image=BitmapFactory.decodeFile(image_uri.getPath()); try { ExifInterface exif = new ExifInterface(image_uri.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch(orientation) { case ExifInterface.ORIENTATION_ROTATE_90: taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200); RotateBitmap(taken_image, 90); break; case ExifInterface.ORIENTATION_ROTATE_180: taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200); RotateBitmap(taken_image, 180); break; case ExifInterface.ORIENTATION_ROTATE_270: taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200); RotateBitmap(taken_image, 270); break; case ExifInterface.ORIENTATION_NORMAL: taken_image=decodeScaledBitmapFromSdCard(image_uri.getPath(), 200, 200); RotateBitmap(taken_image, 0); break; } } catch (OutOfMemoryError e) { Toast.makeText(getActivity(),e+"\"memory exception occured\"",Toast.LENGTH_LONG).show(); } public Bitmap RotateBitmap(Bitmap source, float angle) { Matrix matrix = new Matrix(); matrix.postRotate(angle); round_Image = source; round_Image = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); 

}

 public void setCameraPicOrientation(){ int rotate = 0; try { File imageFile = new File(mCurrentPhotoPath); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } } catch (Exception e) { e.printStackTrace(); } Matrix matrix = new Matrix(); matrix.postRotate(rotate); int targetW = 640; int targetH = 640; /* Get the size of the image */ BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; /* Figure out which way needs to be reduced less */ int scaleFactor = 1; if ((targetW > 0) || (targetH > 0)) { scaleFactor = Math.min(photoW/targetW, photoH/targetH); } /* Set bitmap options to scale the image decode target */ bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; /* Decode the JPEG file into a Bitmap */ Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); bitmap= Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); /* Associate the Bitmap to the ImageView */ imageView.setImageBitmap(bitmap); } 

आशा है कि यह मदद मिलेगी !! धन्यवाद

  public static int mOrientation = 1; OrientationEventListener myOrientationEventListener; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.takephoto); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); myOrientationEventListener = new OrientationEventListener(getApplicationContext()) { @Override public void onOrientationChanged(int o) { // TODO Auto-generated method stub if(!isTablet(getApplicationContext())) { if(o<=285 && o>=80) mOrientation = 2; else mOrientation = 1; } else { if(o<=285 && o>=80) mOrientation = 1; else mOrientation = 2; } } }; myOrientationEventListener.enable(); } public static boolean isTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; } } 

मुझे उम्मीद है कि इससे मदद मिलेगी.धन्यवाद!

बस एक ही मुद्दा यहाँ मुठभेड़, नीचे कोड स्निपेट मेरे लिए काम करता है:

 private static final String[] CONTENT_ORIENTATION = new String[] { MediaStore.Images.ImageColumns.ORIENTATION }; static int getExifOrientation(ContentResolver contentResolver, Uri uri) { Cursor cursor = null; try { cursor = contentResolver.query(uri, CONTENT_ORIENTATION, null, null, null); if (cursor == null || !cursor.moveToFirst()) { return 0; } return cursor.getInt(0); } catch (RuntimeException ignored) { // If the orientation column doesn't exist, assume no rotation. return 0; } finally { if (cursor != null) { cursor.close(); } } } 

आशा है कि यह मदद करता है 🙂

इसे सतह में बदलें चंचल कॉलबैक:

 Camera.Parameters parameters=mCamera.getParameters(); if(this.getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){ parameters.setRotation(90); }else{ parameters.setRotation(0); } mCamera.setParameters(parameters); 

कोड परिदृश्य और परिदृश्य के लिए चित्र @frontCameraID = चर यह दिखाने वाला कैमरे के लिए विधि क्लासिक चाहता था

 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if(holder.getSurface() == null) { return; } try{ camera.stopPreview(); } catch (Exception e){ } try{ int orientation = getDisplayOrientation(frontCameraID); Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } parameters.setRotation(rotationPicture); camera.setParameters(parameters); camera.setDisplayOrientation(orientation); camera.startPreview(); } catch (Exception e) { Log.i("ERROR", "Camera error changed: " + e.getMessage()); } } 

तस्वीर को बचाने और अभिविन्यास प्रदर्शित करने के लिए अभिविन्यास प्राप्त करने के लिए विधि = कैमरा कैमरा के पूर्वावलोकन दृश्य पर @ स्थिति = ओरिएंटेशन @ रोटेशन पिक्चर = चित्र को सही ढंग से सहेजने के लिए जरूरी है

 private int getDisplayOrientation(int cameraId) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = ((Activity) context).getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; rotationPicture = (360 - result) % 360; } else { result = (info.orientation - degrees + 360) % 360; rotationPicture = result; } return result; } 

कोड के बारे में कोई प्रश्न, कृपया मुझे बताओ।