From 0e59e894828a8a0cb5a959b2fc955498fcf522a9 Mon Sep 17 00:00:00 2001 From: David Werth Date: Mon, 3 Jun 2024 09:27:01 +0200 Subject: [PATCH] #94 added clear image option to "cut out" parts of the qr-code and add an image --- README.md | 14 ++++++++---- docs/clearimage.png | Bin 0 -> 14032 bytes package.json | 2 +- projects/ngx-kjua/package.json | 2 +- projects/ngx-kjua/src/lib/kjua/index.d.ts | 2 +- .../src/lib/kjua/lib/create_canvas_qrcode.ts | 17 ++++++++++++++- .../src/lib/kjua/lib/create_svg_qrcode.ts | 20 ++++++++++++++++++ .../ngx-kjua/src/lib/kjua/lib/draw_mode.ts | 7 ++++++ .../ngx-kjua/src/lib/ngx-kjua.interface.ts | 1 + src/app/app.component.html | 3 ++- src/app/app.component.ts | 2 +- 11 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 docs/clearimage.png diff --git a/README.md b/README.md index c00c09c..43bb38c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ [![NPM version](https://img.shields.io/npm/v/ngx-kjua.svg?&label=npm)](https://www.npmjs.com/package/ngx-kjua) -[![Dependency Status](https://david-dm.org/werthdavid/ngx-kjua.svg)](https://david-dm.org/werthdavid/ngx-kjua) [![Downloads](https://img.shields.io/npm/dm/ngx-kjua.svg)](https://npmjs.org/package/ngx-kjua) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/2ef6c180329a44cc9fd95abc77fc8c1d)](https://www.codacy.com/app/werthdavid/ngx-kjua?utm_source=github.com&utm_medium=referral&utm_content=werthdavid/ngx-kjua&utm_campaign=Badge_Grade) If you find my work useful you can buy me a coffee, I am very thankful for your support. @@ -110,6 +108,8 @@ Once the package is imported, you can use it in your Angular application: ## Options +:exclamation: *Caution*: When adding images, label or similar, this will reduce the readability of the QR-code. Consider using a higher error correction level (e.g. L) in those cases. + ### Crisp As you can set the size of the image, the amount of 'modules' (black/white boxes that make up the QR-code) is calculated based on the size and the amount of `quiet` modules. The calculation can result in an odd number so that a module is e.g. 4.5 pixels big. The resulting image will be drawn fuzzy if `crisp` is set to false. Setting it to `true` will result in 'sharp' lines. @@ -131,7 +131,13 @@ This can reduce the readability of the code! ### Image as Code -### Labelimage and Imagelabel +### Clear + Image + + +This mode let's you "cut out" parts of the QR-code and at the same time add an image. + + +### labelimage, imagelabel and clearimage Use this, if you want a label AND an image. In these modes `mSize`, `mPosX` and `mPosY` can be provided as an array. In mode `labelimage`, the first value (index 0) of the `mSize`, `mPosX` and `mPosY` arrays is used for the label, the second value (index 1) is used for image and vice versa. Also in `labelimage` mode, the label is drawn before the @@ -149,7 +155,7 @@ image is drawn and therefore kinda "in the background" if the two overlap. * `back` background color (defaults to `#fff`, for transparent use `''` or `null`) * `rounded` roundend corners in pc: 0..100 (defaults to `0`, not working if `render`is set to `svg`) * `quiet` quiet zone in modules (defaults to `0`) -* `mode` modes: 'plain', 'label' or 'image' (defaults to `plain`, set `label` or `image` property if you change this) +* `mode` modes: 'plain', 'label', 'image' or 'clear' (defaults to `plain`, set `label` or `image` property if you change this) * `mSize` label/image size in pc: 0..100 (defaults to `30`) * `mPosX` label/image pos x in pc: 0..100 (defaults to `50`) * `mPosY` label/image pos y in pc: 0..100 (defaults to `50`) diff --git a/docs/clearimage.png b/docs/clearimage.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ca4491dd525dfc5a4a6f5f403ec7298bf2a431 GIT binary patch literal 14032 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 { const draw = (qr: any, ctx: any, settings: any) => { draw_background(ctx, settings); draw_modules(qr, ctx, settings); - draw_mode(ctx, settings); + if (settings.mode !== "clearimage") { + // we do this later manually + draw_mode(ctx, settings); + } }; export const create_canvas_qrcode = (qr: any, settings: any, as_image: any) => { @@ -81,5 +84,17 @@ export const create_canvas_qrcode = (qr: any, settings: any, as_image: any) => { context.scale(ratio, ratio); draw(qr, context, settings); + if (settings.mode === "clearimage") { + // draw_modules(qr, ctx2, settings); + const imagePos = dom.calc_image_pos(settings); + context.globalCompositeOperation = "destination-out"; + context.fillStyle = "deeppink"; // any color works + context.fillRect(imagePos.x, + imagePos.y, + imagePos.iw, + imagePos.ih); + context.globalCompositeOperation = "source-over"; + draw_mode(context, settings); + } return as_image ? dom.canvas_to_img(canvas, settings.elementId) : canvas; }; diff --git a/projects/ngx-kjua/src/lib/kjua/lib/create_svg_qrcode.ts b/projects/ngx-kjua/src/lib/kjua/lib/create_svg_qrcode.ts index b3c3846..2b14b64 100644 --- a/projects/ngx-kjua/src/lib/kjua/lib/create_svg_qrcode.ts +++ b/projects/ngx-kjua/src/lib/kjua/lib/create_svg_qrcode.ts @@ -330,6 +330,19 @@ export const create_svg_qrcode = (qr: any, settings: any) => { image: get_attr(settings.image, "src"), }); } + + if (settings.mode === "clearimage") { + const ratio = settings.ratio || dpr; + const canvas = create_canvas(settings.size, ratio); + const ctx2 = canvas.getContext("2d"); + const imagePos = calc_image_pos(settings); + ctx2.globalCompositeOperation = "destination-in"; + ctx2.fillStyle = "deeppink"; + ctx2.fillRect(imagePos.x, + imagePos.y, + imagePos.iw, + imagePos.ih) + } } if (mode === "label") { add_label(svg_el, settings); @@ -341,6 +354,13 @@ export const create_svg_qrcode = (qr: any, settings: any) => { } else if (mode === "imagelabel") { add_image(svg_el, settings); add_label(svg_el, settings); + } else if (mode === "clearimage") { + // We set the mode to "labelimage" here. this will change to behavior of calc_image_pos() to use + // the arrayposition 1 (that means, the second position in the pos-array is used for drawing the image. + // the first position in the pos-array is used for clearing the background via "destination-out"). + // We can't just change the calc_image_pos() to use arrayposition 1 in the case of clearimage as we + // call this function as well to calculate the area to be cleared + add_image(svg_el, {...settings, mode: "labelimage"}); } return svg_el; diff --git a/projects/ngx-kjua/src/lib/kjua/lib/draw_mode.ts b/projects/ngx-kjua/src/lib/kjua/lib/draw_mode.ts index f0f7c98..d6b7eb7 100644 --- a/projects/ngx-kjua/src/lib/kjua/lib/draw_mode.ts +++ b/projects/ngx-kjua/src/lib/kjua/lib/draw_mode.ts @@ -65,5 +65,12 @@ export const draw_mode = (ctx: any, settings: any) => { } else if (mode === "imagelabel") { draw_image(ctx, settings); draw_label(ctx, settings); + } else if (mode === "clearimage") { + // We set the mode to "labelimage" here. this will change to behavior of calc_image_pos() to use + // the arrayposition 1 (that means, the second position in the pos-array is used for drawing the image. + // the first position in the pos-array is used for clearing the background via "destination-out"). + // We can't just change the calc_image_pos() to use arrayposition 1 in the case of clearimage as we + // call this function as well to calculate the area to be cleared + draw_image(ctx, {...settings, mode: "labelimage"}); } }; diff --git a/projects/ngx-kjua/src/lib/ngx-kjua.interface.ts b/projects/ngx-kjua/src/lib/ngx-kjua.interface.ts index 57d3074..401bbd3 100644 --- a/projects/ngx-kjua/src/lib/ngx-kjua.interface.ts +++ b/projects/ngx-kjua/src/lib/ngx-kjua.interface.ts @@ -5,4 +5,5 @@ export type KjuaMode = | "label" | "image" | "imagelabel" + | "clearimage" | "labelimage"; diff --git a/src/app/app.component.html b/src/app/app.component.html index 05d3582..9cd75f6 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -71,13 +71,14 @@ +

-
+
diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8027578..e801001 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -19,7 +19,7 @@ export class AppComponent implements AfterViewInit { size = 400; ratio = undefined; fill = "#333333"; - back = "#ffffff"; + back = "transparent"; rounded = 0; quiet = 1; mode: KjuaMode = "label";