@@ -262,69 +262,79 @@ class ImageEditorModuleImpl(private val reactContext: ReactApplicationContext) {
262
262
): Bitmap ? {
263
263
Assertions .assertNotNull(outOptions)
264
264
265
- return openBitmapInputStream(uri, headers)?.use {
266
- // Efficiently crops image without loading full resolution into memory
267
- // https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html
268
- val decoder =
269
- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
270
- BitmapRegionDecoder .newInstance(it)
271
- } else {
272
- @Suppress(" DEPRECATION" ) BitmapRegionDecoder .newInstance(it, false )
273
- } ? : throw Error (" Could not create bitmap decoder. Uri: $uri " )
274
-
275
- val orientation = getOrientation(reactContext, Uri .parse(uri))
276
- val (x, y) =
277
- when (orientation) {
278
- 90 -> yPos to decoder.height - rectWidth - xPos
279
- 270 -> decoder.width - rectHeight - yPos to xPos
280
- 180 -> decoder.width - rectWidth - xPos to decoder.height - rectHeight - yPos
281
- else -> xPos to yPos
282
- }
265
+ return openBitmapInputStream(uri, headers)?.use {
266
+ // Efficiently crops image without loading full resolution into memory
267
+ // https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html
268
+ val decoder =
269
+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
270
+ BitmapRegionDecoder .newInstance(it)
271
+ } else {
272
+ @Suppress(" DEPRECATION" ) BitmapRegionDecoder .newInstance(it, false )
273
+ } ? : throw Error (" Could not create bitmap decoder. Uri: $uri " )
283
274
284
- val (width, height) =
285
- when (orientation) {
286
- 90 ,
287
- 270 -> rectHeight to rectWidth
288
- else -> rectWidth to rectHeight
289
- }
290
- val (targetWidth, targetHeight) =
291
- when (orientation) {
292
- 90 ,
293
- 270 -> outputHeight to outputWidth
294
- else -> outputWidth to outputHeight
295
- }
275
+ val orientation = getOrientation(reactContext, Uri .parse(uri))
276
+ val (x, y) =
277
+ when (orientation) {
278
+ 90 -> yPos to decoder.height - rectWidth - xPos
279
+ 270 -> decoder.width - rectHeight - yPos to xPos
280
+ 180 -> decoder.width - rectWidth - xPos to decoder.height - rectHeight - yPos
281
+ else -> xPos to yPos
282
+ }
283
+
284
+ val (width, height) =
285
+ when (orientation) {
286
+ 90 ,
287
+ 270 -> rectHeight to rectWidth
288
+ else -> rectWidth to rectHeight
289
+ }
290
+ val (targetWidth, targetHeight) =
291
+ when (orientation) {
292
+ 90 ,
293
+ 270 -> outputHeight to outputWidth
294
+ else -> outputWidth to outputHeight
295
+ }
296
296
297
- val cropRectRatio = width / height.toFloat()
298
- val targetRatio = targetWidth / targetHeight.toFloat()
299
- val isCropRatioLargerThanTargetRatio = cropRectRatio > targetRatio
300
- val newWidth =
301
- if (isCropRatioLargerThanTargetRatio) height * targetRatio else width.toFloat()
302
- val newHeight =
303
- if (isCropRatioLargerThanTargetRatio) height.toFloat() else width / targetRatio
304
- val newX = if (isCropRatioLargerThanTargetRatio) x + (width - newWidth) / 2 else x.toFloat()
305
- val newY =
306
- if (isCropRatioLargerThanTargetRatio) y.toFloat() else y + (height - newHeight) / 2
307
- val scale =
308
- if (isCropRatioLargerThanTargetRatio) targetHeight / height.toFloat()
309
- else targetWidth / width.toFloat()
310
-
311
- // Decode the bitmap. We have to open the stream again, like in the example linked above.
312
- // Is there a way to just continue reading from the stream?
313
- outOptions.inSampleSize = getDecodeSampleSize(width, height, targetWidth, targetHeight)
314
-
315
- val cropX = (newX / outOptions.inSampleSize.toFloat()).roundToInt()
316
- val cropY = (newY / outOptions.inSampleSize.toFloat()).roundToInt()
317
- val cropWidth = (newWidth / outOptions.inSampleSize.toFloat()).roundToInt()
318
- val cropHeight = (newHeight / outOptions.inSampleSize.toFloat()).roundToInt()
319
- val cropScale = scale * outOptions.inSampleSize
320
- val scaleMatrix = Matrix ().apply { setScale(cropScale, cropScale) }
321
- val filter = true
322
-
323
- val rect = Rect (0 , 0 , decoder.width, decoder.height)
324
- val bitmap = decoder.decodeRegion(rect, outOptions)
325
-
326
- return Bitmap .createBitmap(bitmap, cropX, cropY, cropWidth, cropHeight, scaleMatrix, filter)
327
- }
297
+ val cropRectRatio = width / height.toFloat()
298
+ val targetRatio = targetWidth / targetHeight.toFloat()
299
+ val isCropRatioLargerThanTargetRatio = cropRectRatio > targetRatio
300
+ val newWidth =
301
+ if (isCropRatioLargerThanTargetRatio) height * targetRatio else width.toFloat()
302
+ val newHeight =
303
+ if (isCropRatioLargerThanTargetRatio) height.toFloat() else width / targetRatio
304
+ val newX =
305
+ if (isCropRatioLargerThanTargetRatio) x + (width - newWidth) / 2 else x.toFloat()
306
+ val newY =
307
+ if (isCropRatioLargerThanTargetRatio) y.toFloat() else y + (height - newHeight) / 2
308
+ val scale =
309
+ if (isCropRatioLargerThanTargetRatio) targetHeight / height.toFloat()
310
+ else targetWidth / width.toFloat()
311
+
312
+ // Decode the bitmap. We have to open the stream again, like in the example linked
313
+ // above.
314
+ // Is there a way to just continue reading from the stream?
315
+ outOptions.inSampleSize = getDecodeSampleSize(width, height, targetWidth, targetHeight)
316
+
317
+ val cropX = (newX / outOptions.inSampleSize.toFloat()).roundToInt()
318
+ val cropY = (newY / outOptions.inSampleSize.toFloat()).roundToInt()
319
+ val cropWidth = (newWidth / outOptions.inSampleSize.toFloat()).roundToInt()
320
+ val cropHeight = (newHeight / outOptions.inSampleSize.toFloat()).roundToInt()
321
+ val cropScale = scale * outOptions.inSampleSize
322
+ val scaleMatrix = Matrix ().apply { setScale(cropScale, cropScale) }
323
+ val filter = true
324
+
325
+ val rect = Rect (0 , 0 , decoder.width, decoder.height)
326
+ val bitmap = decoder.decodeRegion(rect, outOptions)
327
+
328
+ return Bitmap .createBitmap(
329
+ bitmap,
330
+ cropX,
331
+ cropY,
332
+ cropWidth,
333
+ cropHeight,
334
+ scaleMatrix,
335
+ filter
336
+ )
337
+ }
328
338
}
329
339
330
340
private fun openBitmapInputStream (uri : String , headers : HashMap <String , Any ?>? ): InputStream ? {
0 commit comments