11package com.jimmydaddy.imagemarker
22
3- import android.annotation.SuppressLint
4- import android.content.res.Resources
53import android.graphics.Bitmap
64import android.graphics.Bitmap.CompressFormat
7- import android.graphics.BitmapFactory
85import android.graphics.Canvas
96import android.os.Build
107import android.util.Base64
118import android.util.Log
129import androidx.annotation.RequiresApi
13- import com.facebook.common.references.CloseableReference
14- import com.facebook.datasource.DataSource
15- import com.facebook.drawee.backends.pipeline.Fresco
16- import com.facebook.imagepipeline.core.ImagePipelineConfig
17- import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber
18- import com.facebook.imagepipeline.image.CloseableImage
19- import com.facebook.imagepipeline.request.ImageRequest
2010import com.facebook.react.bridge.Promise
2111import com.facebook.react.bridge.ReactApplicationContext
2212import com.facebook.react.bridge.ReactContextBaseJavaModule
2313import com.facebook.react.bridge.ReactMethod
2414import com.facebook.react.bridge.ReadableMap
25- import com.facebook.react.modules.systeminfo.ReactNativeVersion
2615import com.jimmydaddy.imagemarker.base.Constants.BASE64
2716import com.jimmydaddy.imagemarker.base.Constants.IMAGE_MARKER_TAG
28- import com.jimmydaddy.imagemarker.base.ImageOptions
2917import com.jimmydaddy.imagemarker.base.MarkImageOptions
3018import com.jimmydaddy.imagemarker.base.MarkTextOptions
3119import com.jimmydaddy.imagemarker.base.Position.Companion.getImageRectFromPosition
3220import com.jimmydaddy.imagemarker.base.SaveFormat
3321import com.jimmydaddy.imagemarker.base.Utils.Companion.getBlankBitmap
34- import com.jimmydaddy.imagemarker.base.Utils.Companion.getStringSafe
35- import com.jimmydaddy.imagemarker.base.Utils.Companion.scaleBitmap
22+ import kotlinx.coroutines.DelicateCoroutinesApi
3623import kotlinx.coroutines.Dispatchers
3724import kotlinx.coroutines.GlobalScope
3825import kotlinx.coroutines.launch
@@ -41,9 +28,6 @@ import java.io.ByteArrayOutputStream
4128import java.io.FileOutputStream
4229import java.io.IOException
4330import java.util.UUID
44- import java.util.concurrent.Executor
45- import java.util.concurrent.Executors
46-
4731
4832/* *
4933 * Created by jimmydaddy on 2017/3/6.
@@ -55,45 +39,10 @@ class ImageMarkerManager(private val context: ReactApplicationContext) : ReactCo
5539 return NAME
5640 }
5741
58- private val resources: Resources
59- get() = context.resources
60-
61- @SuppressLint(" DiscouragedApi" )
62- private fun getDrawableResourceByName (name : String? ): Int {
63- return resources.getIdentifier(
64- name,
65- " drawable" ,
66- context.packageName
67- )
68- }
69-
70- private fun isFrescoImg (uri : String? ): Boolean {
71- // val base64Pattern =
72- // "^data:(image|img)/(bmp|jpg|png|tif|gif|pcx|tga|exif|fpx|svg|psd|cdr|pcd|dxf|ufo|eps|ai|raw|WMF|webp);base64,(([[A-Za-z0-9+/])*\\s\\S*)*"
73- return uri!! .startsWith(" http://" ) || uri.startsWith(" https://" ) || uri.startsWith(" file://" ) || uri.startsWith(
74- " data:"
75- ) && uri.contains(" base64" ) && (uri.contains(" img" ) || uri.contains(" image" ))
76- }
77-
7842 private fun getSaveFormat (saveFormat : SaveFormat ? ): CompressFormat {
7943 return if (saveFormat != null && saveFormat == = SaveFormat .PNG ) CompressFormat .PNG else CompressFormat .JPEG
8044 }
8145
82- private fun setMaxBitmapSize (maxSize : Int ) {
83- val major = getStringSafe(" major" , ReactNativeVersion .VERSION )
84- val minor = getStringSafe(" minor" , ReactNativeVersion .VERSION )
85- val patch = getStringSafe(" patch" , ReactNativeVersion .VERSION )
86- if (Integer .valueOf(major.toString()) >= 0 && Integer .valueOf(minor.toString()) >= 60 && Integer .valueOf(
87- patch.toString()
88- ) >= 0
89- ) {
90- val config =
91- ImagePipelineConfig .newBuilder(context).experiment().setMaxBitmapSize(maxSize)
92- .build()
93- Fresco .initialize(context, config)
94- }
95- }
96-
9746 private fun markImageByBitmap (
9847 bg : Bitmap ? ,
9948 markers : List <Bitmap ?>,
@@ -140,7 +89,7 @@ class ImageMarkerManager(private val context: ReactApplicationContext) : ReactCo
14089 }
14190 canvas.restore()
14291
143- if (markerBitmap != null && ! markerBitmap.isRecycled) {
92+ if (! markerBitmap.isRecycled) {
14493 markerBitmap.recycle()
14594 System .gc()
14695 }
@@ -266,80 +215,35 @@ class ImageMarkerManager(private val context: ReactApplicationContext) : ReactCo
266215 * @param opts
267216 * @param promise
268217 */
218+ @OptIn(DelicateCoroutinesApi ::class )
219+ @RequiresApi(Build .VERSION_CODES .N )
269220 @ReactMethod
270221 fun markWithText (
271222 opts : ReadableMap ? ,
272223 promise : Promise
273224 ) {
274225 val markOpts = MarkTextOptions .checkParams(opts!! , promise) ? : return
275- try {
276- val dest = generateCacheFilePathForMarker(
277- markOpts.filename,
278- markOpts.saveFormat
279- )
280- Log .d(IMAGE_MARKER_TAG , " uri: " + markOpts.backgroundImage.uri)
281- Log .d(IMAGE_MARKER_TAG , " src: " + markOpts.backgroundImage.src.toString())
282- if (isFrescoImg(markOpts.backgroundImage.uri)) {
283- val imageRequest = ImageRequest .fromUri(markOpts.backgroundImage.uri)
284- if (markOpts.maxSize > 0 ) {
285- setMaxBitmapSize(markOpts.maxSize)
286- }
287- val dataSource = Fresco .getImagePipeline().fetchDecodedImage(imageRequest, null )
288- val executor: Executor = Executors .newSingleThreadExecutor()
289- dataSource.subscribe(object : BaseBitmapDataSubscriber () {
290- public override fun onNewResultImpl (bitmap : Bitmap ? ) {
291- if (bitmap != null ) {
292- val bg = scaleBitmap(bitmap, markOpts.backgroundImage.scale)
293- markImageByText(bg, dest, markOpts, promise)
294- } else {
295- promise.reject(
296- " marker error" ,
297- " Can't retrieve the file from the src: " + markOpts.backgroundImage.uri
298- )
299- }
300- }
301-
302- override fun onFailureImpl (dataSource : DataSource <CloseableReference <CloseableImage >>) {
303- promise.reject(
304- " error" ,
305- " Can't request the image from the uri: " + markOpts.backgroundImage.uri,
306- dataSource.failureCause
307- )
308- }
309- }, executor)
310- } else {
311- val resId = getDrawableResourceByName(markOpts.backgroundImage.uri)
312- if (resId == 0 ) {
313- Log .d(IMAGE_MARKER_TAG , " cannot find res" )
314- promise.reject(
315- " error" ,
316- " Can't get resource by the path: " + markOpts.backgroundImage.uri
317- )
318- } else {
319- Log .d(IMAGE_MARKER_TAG , " res:$resId " )
320- val r = resources
321- // InputStream is = r.openRawResource(resId);
322- val bitmap = BitmapFactory .decodeResource(r, resId)
323- // Bitmap bitmap = BitmapFactory.decodeStream(is);
324- Log .d(IMAGE_MARKER_TAG , bitmap!! .height.toString() + " " )
325- val bg = scaleBitmap(
326- bitmap, markOpts.backgroundImage.scale
226+ Log .d(IMAGE_MARKER_TAG , " uri: " + markOpts.backgroundImage.uri)
227+ Log .d(IMAGE_MARKER_TAG , " src: " + markOpts.backgroundImage.src.toString())
228+ GlobalScope .launch(Dispatchers .Main ) {
229+ try {
230+ val bitmaps = ImageLoader (context, markOpts.maxSize).loadImages(
231+ listOf (
232+ markOpts.backgroundImage,
327233 )
328- Log .d(IMAGE_MARKER_TAG , bg!! .height.toString() + " " )
329- if (! bitmap.isRecycled && markOpts.backgroundImage.scale != 1f ) {
330- bitmap.recycle()
331- System .gc()
332- }
333- markImageByText(bg, dest, markOpts, promise)
334- }
234+ )
235+ val bg = bitmaps[0 ]
236+ val dest = generateCacheFilePathForMarker(markOpts.filename, markOpts.saveFormat)
237+ markImageByText(bg, dest, markOpts, promise)
238+ } catch (e: Exception ) {
239+ Log .d(IMAGE_MARKER_TAG , " error:" + e.message)
240+ e.printStackTrace()
241+ promise.reject(" error" , e.message, e)
335242 }
336- } catch (e: Exception ) {
337- Log .d(IMAGE_MARKER_TAG , " error:" + e.message)
338- e.printStackTrace()
339- promise.reject(" error" , e.message, e)
340243 }
341244 }
342245
246+ @OptIn(DelicateCoroutinesApi ::class )
343247 @RequiresApi(Build .VERSION_CODES .N )
344248 @ReactMethod
345249 fun markWithImage (
@@ -349,7 +253,6 @@ class ImageMarkerManager(private val context: ReactApplicationContext) : ReactCo
349253 val markOpts = MarkImageOptions .checkParams(opts!! , promise) ? : return
350254 GlobalScope .launch(Dispatchers .Main ) {
351255 try {
352-
353256 val markers = markOpts.watermarkImages.map { it.imageOption }
354257 val concatenatedArray = listOf (
355258 markOpts.backgroundImage,
0 commit comments