List of usage examples for android.graphics Matrix postRotate
public boolean postRotate(float degrees)
From source file:com.futurologeek.smartcrossing.crop.CropImageActivity.java
private Bitmap decodeRegionCrop(Rect rect, int outWidth, int outHeight) { // Release memory now clearImageView();// w w w . j ava2 s . c o m InputStream is = null; Bitmap croppedImage = null; try { is = getContentResolver().openInputStream(sourceUri); BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(is, false); final int width = decoder.getWidth(); final int height = decoder.getHeight(); if (exifRotation != 0) { // Adjust crop area to account for image rotation Matrix matrix = new Matrix(); matrix.setRotate(-exifRotation); RectF adjusted = new RectF(); matrix.mapRect(adjusted, new RectF(rect)); //if the cutting box are rectangle( outWidth != outHeight ),and the exifRotation is 90 or 270, //the outWidth and outHeight showld be interchanged if (exifRotation == 90 || exifRotation == 270) { int temp = outWidth; outWidth = outHeight; outHeight = temp; } // Adjust to account for origin at 0,0 adjusted.offset(adjusted.left < 0 ? width : 0, adjusted.top < 0 ? height : 0); rect = new Rect((int) adjusted.left, (int) adjusted.top, (int) adjusted.right, (int) adjusted.bottom); } try { croppedImage = decoder.decodeRegion(rect, new BitmapFactory.Options()); if (rect.width() > outWidth || rect.height() > outHeight) { Matrix matrix = new Matrix(); matrix.postScale((float) outWidth / rect.width(), (float) outHeight / rect.height()); //if the picture's exifRotation !=0 ,they should be rotate to 0 degrees matrix.postRotate(exifRotation); croppedImage = Bitmap.createBitmap(croppedImage, 0, 0, croppedImage.getWidth(), croppedImage.getHeight(), matrix, true); } else { //if the picture need not to be scale, they also neet to be rotate to 0 degrees Matrix matrix = new Matrix(); matrix.postRotate(exifRotation); croppedImage = Bitmap.createBitmap(croppedImage, 0, 0, croppedImage.getWidth(), croppedImage.getHeight(), matrix, true); } } catch (IllegalArgumentException e) { // Rethrow with some extra information throw new IllegalArgumentException("Rectangle " + rect + " is outside of the image (" + width + "," + height + "," + exifRotation + ")", e); } } catch (IOException e) { Log.e("Error cropping image: " + e.getMessage(), e); finish(); } catch (OutOfMemoryError e) { Log.e("OOM cropping image: " + e.getMessage(), e); setResultException(e); } finally { CropUtil.closeSilently(is); } return croppedImage; }
From source file:com.almalence.opencam.SavingService.java
public void saveResultPictureNew(long sessionID) { if (ApplicationScreen.getForceFilename() != null) { saveResultPicture(sessionID);/*w w w. jav a 2s .c om*/ return; } initSavingPrefs(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); // save fused result try { DocumentFile saveDir = getSaveDirNew(false); int imagesAmount = Integer .parseInt(getFromSharedMem("amountofresultframes" + Long.toString(sessionID))); if (imagesAmount == 0) imagesAmount = 1; int imageIndex = 0; String sImageIndex = getFromSharedMem("resultframeindex" + Long.toString(sessionID)); if (sImageIndex != null) imageIndex = Integer.parseInt(getFromSharedMem("resultframeindex" + Long.toString(sessionID))); if (imageIndex != 0) imagesAmount = 1; ContentValues values = null; boolean hasDNGResult = false; for (int i = 1; i <= imagesAmount; i++) { hasDNGResult = false; String format = getFromSharedMem("resultframeformat" + i + Long.toString(sessionID)); if (format != null && format.equalsIgnoreCase("dng")) hasDNGResult = true; String idx = ""; if (imagesAmount != 1) idx += "_" + ((format != null && !format.equalsIgnoreCase("dng") && hasDNGResult) ? i - imagesAmount / 2 : i); String modeName = getFromSharedMem("modeSaveName" + Long.toString(sessionID)); // define file name format. from settings! String fileFormat = getExportFileName(modeName); fileFormat += idx; DocumentFile file = null; if (ApplicationScreen.getForceFilename() == null) { if (hasDNGResult) { file = saveDir.createFile("image/x-adobe-dng", fileFormat + ".dng"); } else { file = saveDir.createFile("image/jpeg", fileFormat); } } else { file = DocumentFile.fromFile(ApplicationScreen.getForceFilename()); } // Create buffer image to deal with exif tags. OutputStream os = null; File bufFile = new File(getApplicationContext().getFilesDir(), "buffer.jpeg"); try { os = new FileOutputStream(bufFile); } catch (Exception e) { e.printStackTrace(); } // Take only one result frame from several results // Used for PreShot plugin that may decide which result to save if (imagesAmount == 1 && imageIndex != 0) { i = imageIndex; //With changed frame index we have to get appropriate frame format format = getFromSharedMem("resultframeformat" + i + Long.toString(sessionID)); } String resultOrientation = getFromSharedMem( "resultframeorientation" + i + Long.toString(sessionID)); int orientation = 0; if (resultOrientation != null) orientation = Integer.parseInt(resultOrientation); String resultMirrored = getFromSharedMem("resultframemirrored" + i + Long.toString(sessionID)); Boolean cameraMirrored = false; if (resultMirrored != null) cameraMirrored = Boolean.parseBoolean(resultMirrored); int x = Integer.parseInt(getFromSharedMem("saveImageHeight" + Long.toString(sessionID))); int y = Integer.parseInt(getFromSharedMem("saveImageWidth" + Long.toString(sessionID))); if (orientation == 0 || orientation == 180 || (format != null && format.equalsIgnoreCase("dng"))) { x = Integer.valueOf(getFromSharedMem("saveImageWidth" + Long.toString(sessionID))); y = Integer.valueOf(getFromSharedMem("saveImageHeight" + Long.toString(sessionID))); } Boolean writeOrientationTag = true; String writeOrientTag = getFromSharedMem("writeorientationtag" + Long.toString(sessionID)); if (writeOrientTag != null) writeOrientationTag = Boolean.parseBoolean(writeOrientTag); if (format != null && format.equalsIgnoreCase("jpeg")) {// if result in jpeg format if (os != null) { byte[] frame = SwapHeap.SwapFromHeap( Integer.parseInt(getFromSharedMem("resultframe" + i + Long.toString(sessionID))), Integer.parseInt( getFromSharedMem("resultframelen" + i + Long.toString(sessionID)))); os.write(frame); try { os.close(); } catch (Exception e) { e.printStackTrace(); } } } else if (format != null && format.equalsIgnoreCase("dng") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { saveDNGPicture(i, sessionID, os, x, y, orientation, cameraMirrored); } else {// if result in nv21 format int yuv = Integer.parseInt(getFromSharedMem("resultframe" + i + Long.toString(sessionID))); com.almalence.YuvImage out = new com.almalence.YuvImage(yuv, ImageFormat.NV21, x, y, null); Rect r; String res = getFromSharedMem("resultfromshared" + Long.toString(sessionID)); if ((null == res) || "".equals(res) || "true".equals(res)) { // to avoid problems with SKIA int cropHeight = out.getHeight() - out.getHeight() % 16; r = new Rect(0, 0, out.getWidth(), cropHeight); } else { if (null == getFromSharedMem("resultcrop0" + Long.toString(sessionID))) { // to avoid problems with SKIA int cropHeight = out.getHeight() - out.getHeight() % 16; r = new Rect(0, 0, out.getWidth(), cropHeight); } else { int crop0 = Integer .parseInt(getFromSharedMem("resultcrop0" + Long.toString(sessionID))); int crop1 = Integer .parseInt(getFromSharedMem("resultcrop1" + Long.toString(sessionID))); int crop2 = Integer .parseInt(getFromSharedMem("resultcrop2" + Long.toString(sessionID))); int crop3 = Integer .parseInt(getFromSharedMem("resultcrop3" + Long.toString(sessionID))); r = new Rect(crop0, crop1, crop0 + crop2, crop1 + crop3); } } jpegQuality = Integer.parseInt(prefs.getString(ApplicationScreen.sJPEGQualityPref, "95")); if (!out.compressToJpeg(r, jpegQuality, os)) { ApplicationScreen.getMessageHandler() .sendEmptyMessage(ApplicationInterface.MSG_EXPORT_FINISHED_IOEXCEPTION); return; } SwapHeap.FreeFromHeap(yuv); } String orientation_tag = String.valueOf(0); // int sensorOrientation = CameraController.getSensorOrientation(CameraController.getCameraIndex()); // int displayOrientation = CameraController.getDisplayOrientation(); //// sensorOrientation = (360 + sensorOrientation + (cameraMirrored ? -displayOrientation //// : displayOrientation)) % 360; // if (cameraMirrored) displayOrientation = -displayOrientation; // // // Calculate desired JPEG orientation relative to camera orientation to make // // the image upright relative to the device orientation // orientation = (sensorOrientation + displayOrientation + 360) % 360; switch (orientation) { default: case 0: orientation_tag = String.valueOf(0); break; case 90: orientation_tag = cameraMirrored ? String.valueOf(270) : String.valueOf(90); break; case 180: orientation_tag = String.valueOf(180); break; case 270: orientation_tag = cameraMirrored ? String.valueOf(90) : String.valueOf(270); break; } int exif_orientation = ExifInterface.ORIENTATION_NORMAL; if (writeOrientationTag) { switch ((orientation + 360) % 360) { default: case 0: exif_orientation = ExifInterface.ORIENTATION_NORMAL; break; case 90: exif_orientation = cameraMirrored ? ExifInterface.ORIENTATION_ROTATE_270 : ExifInterface.ORIENTATION_ROTATE_90; break; case 180: exif_orientation = ExifInterface.ORIENTATION_ROTATE_180; break; case 270: exif_orientation = cameraMirrored ? ExifInterface.ORIENTATION_ROTATE_90 : ExifInterface.ORIENTATION_ROTATE_270; break; } } else { switch ((additionalRotationValue + 360) % 360) { default: case 0: exif_orientation = ExifInterface.ORIENTATION_NORMAL; break; case 90: exif_orientation = cameraMirrored ? ExifInterface.ORIENTATION_ROTATE_270 : ExifInterface.ORIENTATION_ROTATE_90; break; case 180: exif_orientation = ExifInterface.ORIENTATION_ROTATE_180; break; case 270: exif_orientation = cameraMirrored ? ExifInterface.ORIENTATION_ROTATE_90 : ExifInterface.ORIENTATION_ROTATE_270; break; } } if (!enableExifTagOrientation) exif_orientation = ExifInterface.ORIENTATION_NORMAL; values = new ContentValues(); values.put(ImageColumns.TITLE, file.getName().substring(0, file.getName().lastIndexOf(".") >= 0 ? file.getName().lastIndexOf(".") : file.getName().length())); values.put(ImageColumns.DISPLAY_NAME, file.getName()); values.put(ImageColumns.DATE_TAKEN, System.currentTimeMillis()); values.put(ImageColumns.MIME_TYPE, "image/jpeg"); if (enableExifTagOrientation) { if (writeOrientationTag) { values.put(ImageColumns.ORIENTATION, String.valueOf( (Integer.parseInt(orientation_tag) + additionalRotationValue + 360) % 360)); } else { values.put(ImageColumns.ORIENTATION, String.valueOf((additionalRotationValue + 360) % 360)); } } else { values.put(ImageColumns.ORIENTATION, String.valueOf(0)); } String filePath = file.getName(); // If we able to get File object, than get path from it. // fileObject should not be null for files on phone memory. File fileObject = Util.getFileFromDocumentFile(file); if (fileObject != null) { filePath = fileObject.getAbsolutePath(); values.put(ImageColumns.DATA, filePath); } else { // This case should typically happen for files saved to SD // card. String documentPath = Util.getAbsolutePathFromDocumentFile(file); values.put(ImageColumns.DATA, documentPath); } if (!enableExifTagOrientation && !hasDNGResult) { Matrix matrix = new Matrix(); if (writeOrientationTag && (orientation + additionalRotationValue) != 0) { matrix.postRotate((orientation + additionalRotationValue + 360) % 360); rotateImage(bufFile, matrix); } else if (!writeOrientationTag && additionalRotationValue != 0) { matrix.postRotate((additionalRotationValue + 360) % 360); rotateImage(bufFile, matrix); } } if (useGeoTaggingPrefExport) { Location l = MLocation.getLocation(getApplicationContext()); if (l != null) { double lat = l.getLatitude(); double lon = l.getLongitude(); boolean hasLatLon = (lat != 0.0d) || (lon != 0.0d); if (hasLatLon) { values.put(ImageColumns.LATITUDE, l.getLatitude()); values.put(ImageColumns.LONGITUDE, l.getLongitude()); } } } File modifiedFile = null; if (!hasDNGResult) { modifiedFile = saveExifTags(bufFile, sessionID, i, x, y, exif_orientation, useGeoTaggingPrefExport, enableExifTagOrientation); } if (modifiedFile != null) { bufFile.delete(); if (ApplicationScreen.getForceFilename() == null) { // Copy buffer image with exif tags into result file. InputStream is = null; int len; byte[] buf = new byte[4096]; try { os = getApplicationContext().getContentResolver().openOutputStream(file.getUri()); is = new FileInputStream(modifiedFile); while ((len = is.read(buf)) > 0) { os.write(buf, 0, len); } is.close(); os.close(); } catch (IOException eIO) { eIO.printStackTrace(); final IOException eIOFinal = eIO; ApplicationScreen.instance.runOnUiThread(new Runnable() { public void run() { Toast.makeText(MainScreen.getMainContext(), "Error ocurred:" + eIOFinal.getLocalizedMessage(), Toast.LENGTH_LONG) .show(); } }); } catch (Exception e) { e.printStackTrace(); } } else { copyToForceFileName(modifiedFile); } modifiedFile.delete(); } else { // Copy buffer image into result file. InputStream is = null; int len; byte[] buf = new byte[4096]; try { os = getApplicationContext().getContentResolver().openOutputStream(file.getUri()); is = new FileInputStream(bufFile); while ((len = is.read(buf)) > 0) { os.write(buf, 0, len); } is.close(); os.close(); } catch (Exception e) { e.printStackTrace(); } bufFile.delete(); } Uri uri = getApplicationContext().getContentResolver().insert(Images.Media.EXTERNAL_CONTENT_URI, values); broadcastNewPicture(uri); } ApplicationScreen.getMessageHandler().sendEmptyMessage(ApplicationInterface.MSG_EXPORT_FINISHED); } catch (IOException e) { e.printStackTrace(); ApplicationScreen.getMessageHandler() .sendEmptyMessage(ApplicationInterface.MSG_EXPORT_FINISHED_IOEXCEPTION); return; } catch (Exception e) { e.printStackTrace(); ApplicationScreen.getMessageHandler().sendEmptyMessage(ApplicationInterface.MSG_EXPORT_FINISHED); } }
From source file:es.javocsoft.android.lib.toolbox.ToolBox.java
/** * Corrects the orientation of a Bitmap. Orientation, depending of the device * , is not correctly set in the EXIF data of the taken image when it is saved * into disk./*from ww w . j a va 2s. co m*/ * * Explanation: * Camera orientation is not working ok (as is when capturing an image) because * OEMs do not adhere to the standard. So, each company does this following their * own way. * * @param imagePath path to the file * @return */ public static Bitmap media_correctImageOrientation(String imagePath) { Bitmap res = null; try { File f = new File(imagePath); ExifInterface exif = new ExifInterface(f.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { angle = 90; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { angle = 180; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { angle = 270; } Matrix mat = new Matrix(); mat.postRotate(angle); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, options); res = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true); } catch (OutOfMemoryError e) { if (LOG_ENABLE) Log.e(TAG, "media_correctImageOrientation() [OutOfMemory!]: " + e.getMessage(), e); } catch (Exception e) { if (LOG_ENABLE) Log.e(TAG, "media_correctImageOrientation(): " + e.getMessage(), e); } catch (Throwable e) { if (LOG_ENABLE) Log.e(TAG, "media_correctImageOrientation(): " + e.getMessage(), e); } return res; }
From source file:com.almalence.opencam.SavingService.java
protected void addTimestamp(File file, int exif_orientation) { try {// ww w . j a v a2 s . co m SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); int dateFormat = Integer.parseInt(prefs.getString(ApplicationScreen.sTimestampDate, "0")); boolean abbreviation = prefs.getBoolean(ApplicationScreen.sTimestampAbbreviation, false); int saveGeo = Integer.parseInt(prefs.getString(ApplicationScreen.sTimestampGeo, "0")); int timeFormat = Integer.parseInt(prefs.getString(ApplicationScreen.sTimestampTime, "0")); int separator = Integer.parseInt(prefs.getString(ApplicationScreen.sTimestampSeparator, "0")); String customText = prefs.getString(ApplicationScreen.sTimestampCustomText, ""); int color = Integer.parseInt(prefs.getString(ApplicationScreen.sTimestampColor, "1")); int fontSizeC = Integer.parseInt(prefs.getString(ApplicationScreen.sTimestampFontSize, "80")); String formattedCurrentDate = ""; if (dateFormat == 0 && timeFormat == 0 && customText.equals("") && saveGeo == 0) return; String geoText = ""; // show geo data on time stamp if (saveGeo != 0) { Location l = MLocation.getLocation(getApplicationContext()); if (l != null) { if (saveGeo == 2) { Geocoder geocoder = new Geocoder(MainScreen.getMainContext(), Locale.getDefault()); List<Address> list = geocoder.getFromLocation(l.getLatitude(), l.getLongitude(), 1); if (!list.isEmpty()) { String country = list.get(0).getCountryName(); String locality = list.get(0).getLocality(); String adminArea = list.get(0).getSubAdminArea();// city // localized String street = list.get(0).getThoroughfare();// street // localized String address = list.get(0).getAddressLine(0); // replace street and city with localized name if (street != null) address = street; if (adminArea != null) locality = adminArea; geoText = (country != null ? country : "") + (locality != null ? (", " + locality) : "") + (address != null ? (", \n" + address) : ""); if (geoText.equals("")) geoText = "lat:" + l.getLatitude() + "\nlng:" + l.getLongitude(); } } else geoText = "lat:" + l.getLatitude() + "\nlng:" + l.getLongitude(); } } String dateFormatString = ""; String timeFormatString = ""; String separatorString = "."; String monthString = abbreviation ? "MMMM" : "MM"; switch (separator) { case 0: separatorString = "/"; break; case 1: separatorString = "."; break; case 2: separatorString = "-"; break; case 3: separatorString = " "; break; default: separatorString = " "; } switch (dateFormat) { case 1: dateFormatString = "yyyy" + separatorString + monthString + separatorString + "dd"; break; case 2: dateFormatString = "dd" + separatorString + monthString + separatorString + "yyyy"; break; case 3: dateFormatString = monthString + separatorString + "dd" + separatorString + "yyyy"; break; default: } switch (timeFormat) { case 1: timeFormatString = " hh:mm:ss a"; break; case 2: timeFormatString = " HH:mm:ss"; break; default: } Date currentDate = Calendar.getInstance().getTime(); java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat( dateFormatString + timeFormatString); formattedCurrentDate = simpleDateFormat.format(currentDate); formattedCurrentDate += (customText.isEmpty() ? "" : ("\n" + customText)) + (geoText.isEmpty() ? "" : ("\n" + geoText)); if (formattedCurrentDate.equals("")) return; Bitmap sourceBitmap; Bitmap bitmap; int rotation = 0; Matrix matrix = new Matrix(); if (exif_orientation == ExifInterface.ORIENTATION_ROTATE_90) { rotation = 90; } else if (exif_orientation == ExifInterface.ORIENTATION_ROTATE_180) { rotation = 180; } else if (exif_orientation == ExifInterface.ORIENTATION_ROTATE_270) { rotation = 270; } matrix.postRotate(rotation); BitmapFactory.Options options = new BitmapFactory.Options(); options.inMutable = true; sourceBitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options); bitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, false); sourceBitmap.recycle(); int width = bitmap.getWidth(); int height = bitmap.getHeight(); Paint p = new Paint(); Canvas canvas = new Canvas(bitmap); final float scale = getResources().getDisplayMetrics().density; p.setColor(Color.WHITE); switch (color) { case 0: color = Color.BLACK; p.setColor(Color.BLACK); break; case 1: color = Color.WHITE; p.setColor(Color.WHITE); break; case 2: color = Color.YELLOW; p.setColor(Color.YELLOW); break; } if (width > height) { p.setTextSize(height / fontSizeC * scale + 0.5f); // convert dps // to pixels } else { p.setTextSize(width / fontSizeC * scale + 0.5f); // convert dps // to pixels } p.setTextAlign(Align.RIGHT); drawTextWithBackground(canvas, p, formattedCurrentDate, color, Color.BLACK, width, height); Matrix matrix2 = new Matrix(); matrix2.postRotate(360 - rotation); sourceBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix2, false); bitmap.recycle(); FileOutputStream outStream; outStream = new FileOutputStream(file); sourceBitmap.compress(Bitmap.CompressFormat.JPEG, jpegQuality, outStream); sourceBitmap.recycle(); outStream.flush(); outStream.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } }
From source file:com.irccloud.android.activity.MainActivity.java
private Bitmap loadThumbnail(Context context, Uri photoUri) throws IOException { InputStream is = context.getContentResolver().openInputStream(photoUri); BitmapFactory.Options dbo = new BitmapFactory.Options(); dbo.inJustDecodeBounds = true;/*from w w w .ja v a 2 s .com*/ BitmapFactory.decodeStream(is, null, dbo); is.close(); int rotatedWidth, rotatedHeight; int orientation = getOrientation(context, photoUri); if (orientation == 90 || orientation == 270) { rotatedWidth = dbo.outHeight; rotatedHeight = dbo.outWidth; } else { rotatedWidth = dbo.outWidth; rotatedHeight = dbo.outHeight; } Bitmap srcBitmap; is = context.getContentResolver().openInputStream(photoUri); if (rotatedWidth > 1024 || rotatedHeight > 1024) { float widthRatio = ((float) rotatedWidth) / ((float) 1024); float heightRatio = ((float) rotatedHeight) / ((float) 1024); float maxRatio = Math.max(widthRatio, heightRatio); // Create the bitmap from file BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = (int) maxRatio; srcBitmap = BitmapFactory.decodeStream(is, null, options); } else { srcBitmap = BitmapFactory.decodeStream(is); } is.close(); /* * if the orientation is not 0 (or -1, which means we don't know), we * have to do a rotation. */ if (orientation > 0) { Matrix matrix = new Matrix(); matrix.postRotate(orientation); srcBitmap = Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(), srcBitmap.getHeight(), matrix, true); } return srcBitmap; }
From source file:com.irccloud.android.activity.MainActivity.java
private Uri resize(Uri in) { Uri out = null;//from w w w .j a va2 s .c om try { int MAX_IMAGE_SIZE = Integer .parseInt(PreferenceManager.getDefaultSharedPreferences(this).getString("photo_size", "1024")); File imageDir = new File(Environment.getExternalStorageDirectory(), "IRCCloud"); imageDir.mkdirs(); new File(imageDir, ".nomedia").createNewFile(); BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(IRCCloudApplication.getInstance().getApplicationContext() .getContentResolver().openInputStream(in), null, o); int scale = 1; if (o.outWidth < MAX_IMAGE_SIZE && o.outHeight < MAX_IMAGE_SIZE) return in; if (o.outWidth > o.outHeight) { if (o.outWidth > MAX_IMAGE_SIZE) scale = o.outWidth / MAX_IMAGE_SIZE; } else { if (o.outHeight > MAX_IMAGE_SIZE) scale = o.outHeight / MAX_IMAGE_SIZE; } o = new BitmapFactory.Options(); o.inSampleSize = scale; Bitmap bmp = BitmapFactory.decodeStream(IRCCloudApplication.getInstance().getApplicationContext() .getContentResolver().openInputStream(in), null, o); //ExifInterface can only work on local files, so make a temporary copy on the SD card out = Uri.fromFile(File.createTempFile("irccloudcapture-original", ".jpg", imageDir)); InputStream is = IRCCloudApplication.getInstance().getApplicationContext().getContentResolver() .openInputStream(in); OutputStream os = IRCCloudApplication.getInstance().getApplicationContext().getContentResolver() .openOutputStream(out); byte[] buffer = new byte[8192]; int len; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } is.close(); os.close(); ExifInterface exif = new ExifInterface(out.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); new File(new URI(out.toString())).delete(); out = Uri.fromFile(File.createTempFile("irccloudcapture-resized", ".jpg", imageDir)); if (orientation > 1) { Matrix matrix = new Matrix(); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: matrix.postRotate(90); break; case ExifInterface.ORIENTATION_ROTATE_180: matrix.postRotate(180); break; case ExifInterface.ORIENTATION_ROTATE_270: matrix.postRotate(270); break; } try { Bitmap oldbmp = bmp; bmp = Bitmap.createBitmap(oldbmp, 0, 0, oldbmp.getWidth(), oldbmp.getHeight(), matrix, true); oldbmp.recycle(); } catch (OutOfMemoryError e) { Log.e("IRCCloud", "Out of memory rotating the photo, it may look wrong on imgur"); } } if (bmp == null || !bmp.compress(android.graphics.Bitmap.CompressFormat.JPEG, 90, IRCCloudApplication .getInstance().getApplicationContext().getContentResolver().openOutputStream(out))) { out = null; } if (bmp != null) bmp.recycle(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { Crashlytics.logException(e); } catch (OutOfMemoryError e) { Log.e("IRCCloud", "Out of memory rotating the photo, it may look wrong on imgur"); } if (!PreferenceManager.getDefaultSharedPreferences(this).getBoolean("keep_photos", false) && in.toString().contains("irccloudcapture")) { try { new File(new URI(in.toString())).delete(); } catch (Exception e) { } } if (out != null) return out; else return in; }
From source file:com.codename1.impl.android.AndroidImplementation.java
@Override public Object createImage(String path) throws IOException { int IMAGE_MAX_SIZE = getDisplayHeight(); if (exists(path)) { Bitmap b = null;/*w w w.j av a2s.c o m*/ try { //Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; o.inPreferredConfig = Bitmap.Config.ARGB_8888; InputStream fis = createFileInputStream(path); BitmapFactory.decodeStream(fis, null, o); fis.close(); int scale = 1; if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) { scale = (int) Math.pow(2, (int) Math.round( Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))); } //Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inPreferredConfig = Bitmap.Config.ARGB_8888; if (sampleSizeOverride != -1) { o2.inSampleSize = sampleSizeOverride; } else { String sampleSize = Display.getInstance().getProperty("android.sampleSize", null); if (sampleSize != null) { o2.inSampleSize = Integer.parseInt(sampleSize); } else { o2.inSampleSize = scale; } } o2.inPurgeable = true; o2.inInputShareable = true; fis = createFileInputStream(path); b = BitmapFactory.decodeStream(fis, null, o2); fis.close(); //fix rotation ExifInterface exif = new ExifInterface(path); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: angle = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: angle = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: angle = 270; break; } if (sampleSizeOverride < 0 && angle != 0) { Matrix mat = new Matrix(); mat.postRotate(angle); Bitmap correctBmp = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), mat, true); b.recycle(); b = correctBmp; } } catch (IOException e) { } return b; } else { InputStream in = this.getResourceAsStream(getClass(), path); if (in == null) { throw new IOException("Resource not found. " + path); } try { return this.createImage(in); } finally { if (in != null) { try { in.close(); } catch (Exception ignored) { ; } } } } }
From source file:com.codename1.impl.android.AndroidImplementation.java
@Override public com.codename1.ui.util.ImageIO getImageIO() { if (imIO == null) { imIO = new com.codename1.ui.util.ImageIO() { @Override/* w w w . ja v a 2 s .c o m*/ public Dimension getImageSize(String imageFilePath) throws IOException { BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; o.inPreferredConfig = Bitmap.Config.ARGB_8888; InputStream fis = createFileInputStream(imageFilePath); BitmapFactory.decodeStream(fis, null, o); fis.close(); ExifInterface exif = new ExifInterface(imageFilePath); // if the image is in portrait mode int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); if (orientation == ExifInterface.ORIENTATION_ROTATE_90 || orientation == ExifInterface.ORIENTATION_ROTATE_270) { return new Dimension(o.outHeight, o.outWidth); } return new Dimension(o.outWidth, o.outHeight); } private Dimension getImageSizeNoRotation(String imageFilePath) throws IOException { BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; o.inPreferredConfig = Bitmap.Config.ARGB_8888; InputStream fis = createFileInputStream(imageFilePath); BitmapFactory.decodeStream(fis, null, o); fis.close(); return new Dimension(o.outWidth, o.outHeight); } @Override public void save(InputStream image, OutputStream response, String format, int width, int height, float quality) throws IOException { Bitmap.CompressFormat f = Bitmap.CompressFormat.PNG; if (format == FORMAT_JPEG) { f = Bitmap.CompressFormat.JPEG; } Image img = Image.createImage(image).scaled(width, height); Bitmap b = (Bitmap) img.getImage(); b.compress(f, (int) (quality * 100), response); } @Override public String saveAndKeepAspect(String imageFilePath, String preferredOutputPath, String format, int width, int height, float quality, boolean onlyDownscale, boolean scaleToFill) throws IOException { ExifInterface exif = new ExifInterface(imageFilePath); Dimension d = getImageSizeNoRotation(imageFilePath); if (onlyDownscale) { if (scaleToFill) { if (d.getHeight() <= height || d.getWidth() <= width) { return imageFilePath; } } else { if (d.getHeight() <= height && d.getWidth() <= width) { return imageFilePath; } } } float ratio = ((float) d.getWidth()) / ((float) d.getHeight()); int heightBasedOnWidth = (int) (((float) width) / ratio); int widthBasedOnHeight = (int) (((float) height) * ratio); if (scaleToFill) { if (heightBasedOnWidth >= width) { height = heightBasedOnWidth; } else { width = widthBasedOnHeight; } } else { if (heightBasedOnWidth > width) { width = widthBasedOnHeight; } else { height = heightBasedOnWidth; } } sampleSizeOverride = Math.max(d.getWidth() / width, d.getHeight() / height); OutputStream im = FileSystemStorage.getInstance().openOutputStream(preferredOutputPath); Image i = Image.createImage(imageFilePath); Image newImage = i.scaled(width, height); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: angle = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: angle = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: angle = 270; break; } if (angle != 0) { Matrix mat = new Matrix(); mat.postRotate(angle); Bitmap b = (Bitmap) newImage.getImage(); Bitmap correctBmp = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), mat, true); b.recycle(); newImage.dispose(); Image tmp = Image.createImage(correctBmp); newImage = tmp; save(tmp, im, format, quality); } else { save(imageFilePath, im, format, width, height, quality); } sampleSizeOverride = -1; return preferredOutputPath; } @Override public void save(String imageFilePath, OutputStream response, String format, int width, int height, float quality) throws IOException { Image i = Image.createImage(imageFilePath); Image newImage = i.scaled(width, height); save(newImage, response, format, quality); newImage.dispose(); i.dispose(); } @Override protected void saveImage(Image img, OutputStream response, String format, float quality) throws IOException { Bitmap.CompressFormat f = Bitmap.CompressFormat.PNG; if (format == FORMAT_JPEG) { f = Bitmap.CompressFormat.JPEG; } Bitmap b = (Bitmap) img.getImage(); b.compress(f, (int) (quality * 100), response); } @Override public boolean isFormatSupported(String format) { return format == FORMAT_JPEG || format == FORMAT_PNG; } }; } return imIO; }