diff --git a/src/core/helpers/hidpi.js b/src/core/helpers/hidpi.js index b235568d65d002845c89d89b5750508e50c496fc..1892f2f75f75b279b3dc27f05ff32663d2c3eef8 100644 --- a/src/core/helpers/hidpi.js +++ b/src/core/helpers/hidpi.js @@ -1,4 +1,4 @@ -const pixelRatio = (function () { +export const pixelRatio = (function () { const canvas = document.createElement('canvas') const context = canvas.getContext('2d') const backingStore = context.backingStorePixelRatio || @@ -163,7 +163,4 @@ export function wrapper (canvas) { canvas.width *= pixelRatio canvas.height *= pixelRatio canvas.getContext('2d').__hidpi__ = true - - console.log(canvas.width) - console.log(canvas.height) } diff --git a/src/core/service/api/context/canvas.js b/src/core/service/api/context/canvas.js index cd60bfe4ea9af50495808cad1b3b16ccb3ca6a24..9fdb55f2c49e20a255636c4e0db5a9162b095e07 100644 --- a/src/core/service/api/context/canvas.js +++ b/src/core/service/api/context/canvas.js @@ -1,5 +1,5 @@ import createCallbacks from 'uni-helpers/callbacks' -import { wrapper } from 'uni-helpers/hidpi' +import { wrapper, pixelRatio } from 'uni-helpers/hidpi' const canvasEventCallbacks = createCallbacks('canvasEvent') @@ -255,10 +255,16 @@ var methods3 = ['setFillStyle', 'setTextAlign', 'setStrokeStyle', 'setGlobalAlph ] var tempCanvas -function getTempCanvas () { +function getTempCanvas (width, height) { if (!tempCanvas) { tempCanvas = document.createElement('canvas') - wrapper(tempCanvas) + } + if (typeof width !== 'undefined' && typeof height !== 'undefined') { + if (tempCanvas.width !== width || tempCanvas.height !== height) { + tempCanvas.width = width / pixelRatio + tempCanvas.height = height / pixelRatio + wrapper(tempCanvas) + } } return tempCanvas } @@ -812,6 +818,12 @@ export function canvasToTempFilePath ({ fileType, qualit }, callbackId) { + if (typeof width !== 'undefined') { + width *= pixelRatio + } + if (typeof height !== 'undefined') { + height *= pixelRatio + } var pageId const app = getApp() if (app.$route && app.$route.params.__id__) { @@ -838,23 +850,37 @@ export function canvasToTempFilePath ({ }) return } - var canvas = getTempCanvas() - canvas.width = data.width - canvas.height = data.height + var cWidth = (typeof destWidth !== 'undefined') ? (destWidth * pixelRatio) : data.width + var cHeight = (typeof destHeight !== 'undefined') ? (destHeight * pixelRatio) : data.height + var canvas = getTempCanvas(cWidth, cHeight) var c2d = canvas.getContext('2d') - c2d.putImageData(imgData, 0, 0, 0, 0, destWidth || imgData.width, destHeight || imgData.height) - var imageType = fileType ? fileType.toLowerCase() : 'png' - var base64 - if (imageType === 'jpg' || imageType === 'jpeg') { - var tmpCanvas = canvas.cloneNode(true) - var tmpCtx = tmpCanvas.getContext('2d') - tmpCtx.fillStyle = '#fff' - tmpCtx.fillRect(0, 0, tmpCanvas.width, tmpCanvas.height) - tmpCtx.drawImage(canvas, 0, 0) - base64 = tmpCanvas.toDataURL(`image/jpeg`, qualit) + c2d.putImageData(imgData, 0, 0, 0, 0, imgData.width, imgData.height) + var imageType = (fileType ? fileType.toLowerCase() : 'png') + if (imageType === 'jpg') { + imageType = 'jpeg' + } + + var dCanvas + var isDest = (typeof destWidth !== 'undefined' && typeof destHeight !== 'undefined') + if (isDest) { + dCanvas = document.createElement('canvas') + dCanvas.width = destWidth + dCanvas.height = destHeight + } else { + dCanvas = canvas.cloneNode(true) + } + var dCtx = dCanvas.getContext('2d') + if (imageType === 'jpeg') { + dCtx.fillStyle = '#fff' + dCtx.fillRect(0, 0, dCanvas.width, dCanvas.height) + } + + if (isDest) { + dCtx.drawImageByCanvas(canvas, 0, 0, canvas.width, canvas.height, 0, 0, destWidth, destHeight, true) } else { - base64 = canvas.toDataURL(`image/${imageType}`, qualit) + dCtx.drawImage(canvas, 0, 0) } + var base64 = dCanvas.toDataURL(`image/${imageType}`, qualit) invoke(callbackId, { errMsg: 'canvasToTempFilePath:ok', @@ -866,8 +892,6 @@ export function canvasToTempFilePath ({ // img.onload = function () { // canvas.width = destWidth || imgData.width // canvas.height = destHeight || imgData.height - // c2d.fillStyle = '#fff' - // c2d.fillRect(0, 0, canvas.width, canvas.height) // c2d.drawImage(img, 0, 0) // base64 = canvas.toDataURL(`image/jpeg`, qualit) // invoke(callbackId, { diff --git a/src/core/view/components/canvas/index.vue b/src/core/view/components/canvas/index.vue index 94e7f221216dd38f4e1470cc7c71505ad3284ed2..80d1b227f6a4e1cf483cf0b04f59c9d06215a629 100644 --- a/src/core/view/components/canvas/index.vue +++ b/src/core/view/components/canvas/index.vue @@ -10,6 +10,9 @@
+