Skip to content

Commit 783b2ab

Browse files
authored
fix: image scale (#114)
* docs: v1.0.1 title * fix: image scale
1 parent ec73482 commit 783b2ab

38 files changed

+194
-278
lines changed

README.MD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Add text or icon watermark to your images
5050
| React Native Version | react-native-image-marker Version |
5151
| ---------------------| --------------------------------- |
5252
| < 0.60.0 | v0.5.2 or earlier |
53-
| >= 0.60.0, iOS < 13, Android < N | v1.0.1 |
53+
| >= 0.60.0, iOS < 13, Android < N | v1.0.x |
5454
| >= 0.60.0, other cases | v1.1.0 or later |
5555

5656
> Note: This table is only applicable to major versions of react-native-image-marker. Patch versions should be backwards compatible.
@@ -212,7 +212,7 @@ await ImageMarker.markImage(options);
212212
## API
213213

214214
* [the latest version](https://jimmydaddy.github.io/react-native-image-marker/classes/Marker.html)
215-
* [v1.0.1](https://jimmydaddy.github.io/react-native-image-marker/v1.0.1/classes/Marker.html)
215+
* [v1.0.x](https://jimmydaddy.github.io/react-native-image-marker/v1.0.x/classes/Marker.html)
216216
* If you are using a version lower than 1.0.0, please go to [v0.9.2](https://github.com/JimmyDaddy/react-native-image-marker/wiki/0.9.2)
217217

218218
## Extra about Android decoding image

android/src/main/java/com/jimmydaddy/imagemarker/ImageMarkerManager.kt

Lines changed: 20 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,25 @@
11
package com.jimmydaddy.imagemarker
22

3-
import android.annotation.SuppressLint
4-
import android.content.res.Resources
53
import android.graphics.Bitmap
64
import android.graphics.Bitmap.CompressFormat
7-
import android.graphics.BitmapFactory
85
import android.graphics.Canvas
96
import android.os.Build
107
import android.util.Base64
118
import android.util.Log
129
import 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
2010
import com.facebook.react.bridge.Promise
2111
import com.facebook.react.bridge.ReactApplicationContext
2212
import com.facebook.react.bridge.ReactContextBaseJavaModule
2313
import com.facebook.react.bridge.ReactMethod
2414
import com.facebook.react.bridge.ReadableMap
25-
import com.facebook.react.modules.systeminfo.ReactNativeVersion
2615
import com.jimmydaddy.imagemarker.base.Constants.BASE64
2716
import com.jimmydaddy.imagemarker.base.Constants.IMAGE_MARKER_TAG
28-
import com.jimmydaddy.imagemarker.base.ImageOptions
2917
import com.jimmydaddy.imagemarker.base.MarkImageOptions
3018
import com.jimmydaddy.imagemarker.base.MarkTextOptions
3119
import com.jimmydaddy.imagemarker.base.Position.Companion.getImageRectFromPosition
3220
import com.jimmydaddy.imagemarker.base.SaveFormat
3321
import 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
3623
import kotlinx.coroutines.Dispatchers
3724
import kotlinx.coroutines.GlobalScope
3825
import kotlinx.coroutines.launch
@@ -41,9 +28,6 @@ import java.io.ByteArrayOutputStream
4128
import java.io.FileOutputStream
4229
import java.io.IOException
4330
import 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,

docs/latest/classes/Marker.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ <h4>Hierarchy</h4>
2020
<ul class="tsd-hierarchy">
2121
<li><span class="target">Marker</span></li></ul></section><aside class="tsd-sources">
2222
<ul>
23-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L682">index.ts:682</a></li></ul></aside>
23+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L682">index.ts:682</a></li></ul></aside>
2424
<section class="tsd-panel-group tsd-index-group">
2525
<section class="tsd-panel tsd-index-panel">
2626
<details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -53,7 +53,7 @@ <h4>Example</h4><pre><code class="language-ts"><span class="hl-5">const</span><s
5353
</code><button>Copy</button></pre>
5454
</div><aside class="tsd-sources">
5555
<ul>
56-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L835">index.ts:835</a></li></ul></aside></li></ul></section>
56+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L835">index.ts:835</a></li></ul></aside></li></ul></section>
5757
<section class="tsd-panel tsd-member"><a id="markText" class="tsd-anchor"></a>
5858
<h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagStatic">Static</code> <span>mark<wbr/>Text</span><a href="#markText" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
5959
<ul class="tsd-signatures">
@@ -74,7 +74,7 @@ <h4>Example</h4><pre><code class="language-ts"><span class="hl-5">const</span><s
7474
</code><button>Copy</button></pre>
7575
</div><aside class="tsd-sources">
7676
<ul>
77-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L767">index.ts:767</a></li></ul></aside></li></ul></section></section></div>
77+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L767">index.ts:767</a></li></ul></aside></li></ul></section></section></div>
7878
<div class="col-sidebar">
7979
<div class="page-menu">
8080
<div class="tsd-navigation settings">

docs/latest/enums/ImageFormat.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ <h1>Enumeration ImageFormat</h1></div>
2020
<h4>Description</h4><p>ImageFormat enum for save image format</p>
2121
</div></section><aside class="tsd-sources">
2222
<ul>
23-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L38">index.ts:38</a></li></ul></aside>
23+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L38">index.ts:38</a></li></ul></aside>
2424
<section class="tsd-panel-group tsd-index-group">
2525
<section class="tsd-panel tsd-index-panel">
2626
<details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
@@ -38,17 +38,17 @@ <h2>Enumeration Members</h2>
3838
<h3 class="tsd-anchor-link"><span>base64</span><a href="#base64" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><g stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round" id="icon-anchor"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></g></svg></a></h3>
3939
<div class="tsd-signature"><span class="tsd-kind-enum-member">base64</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">&quot;base64&quot;</span></div><aside class="tsd-sources">
4040
<ul>
41-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L42">index.ts:42</a></li></ul></aside></section>
41+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L42">index.ts:42</a></li></ul></aside></section>
4242
<section class="tsd-panel tsd-member"><a id="jpg" class="tsd-anchor"></a>
4343
<h3 class="tsd-anchor-link"><span>jpg</span><a href="#jpg" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
4444
<div class="tsd-signature"><span class="tsd-kind-enum-member">jpg</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">&quot;jpg&quot;</span></div><aside class="tsd-sources">
4545
<ul>
46-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L40">index.ts:40</a></li></ul></aside></section>
46+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L40">index.ts:40</a></li></ul></aside></section>
4747
<section class="tsd-panel tsd-member"><a id="png" class="tsd-anchor"></a>
4848
<h3 class="tsd-anchor-link"><span>png</span><a href="#png" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
4949
<div class="tsd-signature"><span class="tsd-kind-enum-member">png</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">&quot;png&quot;</span></div><aside class="tsd-sources">
5050
<ul>
51-
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/814312b/src/index.ts#L39">index.ts:39</a></li></ul></aside></section></section></div>
51+
<li>Defined in <a href="https://github.com/JimmyDaddy/react-native-image-marker/blob/08ed8cf/src/index.ts#L39">index.ts:39</a></li></ul></aside></section></section></div>
5252
<div class="col-sidebar">
5353
<div class="page-menu">
5454
<div class="tsd-navigation settings">

0 commit comments

Comments
 (0)