parent
4481c7ad45
commit
fa9fba1f90
@ -0,0 +1,28 @@ |
||||
package com.flurgle.camerakit; |
||||
|
||||
|
||||
import android.support.media.ExifInterface; |
||||
|
||||
class ExifUtils { |
||||
|
||||
public static int getOrientationTag(int rotation, boolean flip) { |
||||
switch (rotation) { |
||||
case 90: |
||||
return flip ? ExifInterface.ORIENTATION_TRANSPOSE : |
||||
ExifInterface.ORIENTATION_ROTATE_90; |
||||
|
||||
case 180: |
||||
return flip ? ExifInterface.ORIENTATION_FLIP_VERTICAL : |
||||
ExifInterface.ORIENTATION_ROTATE_180; |
||||
|
||||
case 270: |
||||
return flip ? ExifInterface.ORIENTATION_TRANSVERSE : |
||||
ExifInterface.ORIENTATION_ROTATE_270; |
||||
|
||||
case 0: |
||||
default: |
||||
return flip ? ExifInterface.ORIENTATION_FLIP_HORIZONTAL : |
||||
ExifInterface.ORIENTATION_NORMAL; |
||||
} |
||||
} |
||||
} |
@ -1,67 +0,0 @@ |
||||
package com.flurgle.camerakit; |
||||
|
||||
import android.graphics.Bitmap; |
||||
import android.graphics.BitmapFactory; |
||||
import android.graphics.BitmapRegionDecoder; |
||||
import android.graphics.Rect; |
||||
import android.graphics.YuvImage; |
||||
import android.util.Log; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
|
||||
public class CenterCrop { |
||||
|
||||
private byte[] croppedJpeg; |
||||
|
||||
public CenterCrop(YuvImage yuv, AspectRatio targetRatio, int jpegCompression) { |
||||
Rect crop = getCrop(yuv.getWidth(), yuv.getHeight(), targetRatio); |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
yuv.compressToJpeg(crop, jpegCompression, out); |
||||
this.croppedJpeg = out.toByteArray(); |
||||
} |
||||
|
||||
public CenterCrop(byte[] jpeg, AspectRatio targetRatio, int jpegCompression) { |
||||
BitmapFactory.Options options = new BitmapFactory.Options(); |
||||
options.inJustDecodeBounds = true; |
||||
BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length, options); |
||||
|
||||
Rect crop = getCrop(options.outWidth, options.outHeight, targetRatio); |
||||
try { |
||||
Bitmap bitmap = BitmapRegionDecoder.newInstance( |
||||
jpeg, |
||||
0, |
||||
jpeg.length, |
||||
true |
||||
).decodeRegion(crop, null); |
||||
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
bitmap.compress(Bitmap.CompressFormat.JPEG, jpegCompression, out); |
||||
this.croppedJpeg = out.toByteArray(); |
||||
} catch (IOException e) { |
||||
Log.e("CameraKit", e.toString()); |
||||
} |
||||
} |
||||
|
||||
private static Rect getCrop(int currentWidth, int currentHeight, AspectRatio targetRatio) { |
||||
AspectRatio currentRatio = AspectRatio.of(currentWidth, currentHeight); |
||||
|
||||
Rect crop; |
||||
if (currentRatio.toFloat() > targetRatio.toFloat()) { |
||||
int width = (int) (currentHeight * targetRatio.toFloat()); |
||||
int widthOffset = (currentWidth - width) / 2; |
||||
crop = new Rect(widthOffset, 0, currentWidth - widthOffset, currentHeight); |
||||
} else { |
||||
int height = (int) (currentWidth * targetRatio.inverse().toFloat()); |
||||
int heightOffset = (currentHeight - height) / 2; |
||||
crop = new Rect(0, heightOffset, currentWidth, currentHeight - heightOffset); |
||||
} |
||||
|
||||
return crop; |
||||
} |
||||
|
||||
public byte[] getJpeg() { |
||||
return croppedJpeg; |
||||
} |
||||
|
||||
} |
@ -1,39 +0,0 @@ |
||||
package com.flurgle.camerakit; |
||||
|
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
import java.util.TreeSet; |
||||
|
||||
public class CommonAspectRatioFilter { |
||||
|
||||
private List<Size> mPreviewSizes; |
||||
private List<Size> mCaptureSizes; |
||||
|
||||
public CommonAspectRatioFilter(List<Size> previewSizes, List<Size> captureSizes) { |
||||
this.mPreviewSizes = previewSizes; |
||||
this.mCaptureSizes = captureSizes; |
||||
} |
||||
|
||||
public TreeSet<AspectRatio> filter() { |
||||
Set<AspectRatio> previewAspectRatios = new HashSet<>(); |
||||
for (Size size : mPreviewSizes) { |
||||
previewAspectRatios.add(AspectRatio.of(size.getWidth(), size.getHeight())); |
||||
} |
||||
|
||||
Set<AspectRatio> captureAspectRatios = new HashSet<>(); |
||||
for (Size size : mCaptureSizes) { |
||||
captureAspectRatios.add(AspectRatio.of(size.getWidth(), size.getHeight())); |
||||
} |
||||
|
||||
TreeSet<AspectRatio> output = new TreeSet<>(); |
||||
for (AspectRatio aspectRatio : previewAspectRatios) { |
||||
if (captureAspectRatios.contains(aspectRatio)) { |
||||
output.add(aspectRatio); |
||||
} |
||||
} |
||||
|
||||
return output; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,53 @@ |
||||
package com.flurgle.camerakit; |
||||
|
||||
import android.graphics.Bitmap; |
||||
import android.graphics.BitmapRegionDecoder; |
||||
import android.graphics.Rect; |
||||
import android.graphics.YuvImage; |
||||
import android.util.Log; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
|
||||
public class CropHelper { |
||||
|
||||
|
||||
// TODO test this. How is YuvImage? Does it come already well rotated?
|
||||
public static byte[] cropToJpeg(YuvImage yuv, AspectRatio targetRatio, int jpegCompression) { |
||||
Rect crop = computeCrop(yuv.getWidth(), yuv.getHeight(), targetRatio); |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
yuv.compressToJpeg(crop, jpegCompression, out); |
||||
return out.toByteArray(); |
||||
} |
||||
|
||||
|
||||
// This reads a rotated Bitmap thanks to CameraUtils. Then crops and returns a byte array.
|
||||
// In doing so, EXIF data is deleted.
|
||||
public static byte[] cropToJpeg(byte[] jpeg, AspectRatio targetRatio, int jpegCompression) { |
||||
Bitmap image = CameraUtils.decodeBitmap(jpeg); |
||||
Log.e("CropHelper", "decoded image has width="+image.getWidth()+", height="+image.getHeight()); |
||||
Rect cropRect = computeCrop(image.getWidth(), image.getHeight(), targetRatio); |
||||
Bitmap crop = Bitmap.createBitmap(image, cropRect.left, cropRect.top, cropRect.width(), cropRect.height()); |
||||
image.recycle(); |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
crop.compress(Bitmap.CompressFormat.JPEG, jpegCompression, out); |
||||
return out.toByteArray(); |
||||
} |
||||
|
||||
private static Rect computeCrop(int currentWidth, int currentHeight, AspectRatio targetRatio) { |
||||
AspectRatio currentRatio = AspectRatio.of(currentWidth, currentHeight); |
||||
int x, y, width, height; |
||||
if (currentRatio.toFloat() > targetRatio.toFloat()) { |
||||
height = currentHeight; |
||||
width = (int) (height * targetRatio.toFloat()); |
||||
y = 0; |
||||
x = (currentWidth - width) / 2; |
||||
} else { |
||||
width = currentWidth; |
||||
height = (int) (width * targetRatio.inverse().toFloat()); |
||||
y = (currentHeight - height) / 2; |
||||
x = 0; |
||||
} |
||||
return new Rect(x, y, x+width, y+height); |
||||
} |
||||
} |
Loading…
Reference in new issue