提交 ba20aaf2 编写于 作者: 雪洛's avatar 雪洛

fix(v3): add canvasToTempFilePath etc.

上级 05af8047
import createCallbacks from 'uni-helpers/callbacks' import createCallbacks from 'uni-helpers/callbacks'
import { import {
invokeMethod,
getCurrentPageId getCurrentPageId
} from '../../platform' } from '../../platform'
import {
invoke
} from '../../bridge'
const canvasEventCallbacks = createCallbacks('canvasEvent') const canvasEventCallbacks = createCallbacks('canvasEvent')
UniServiceJSBridge.subscribe('onDrawCanvas', ({ UniServiceJSBridge.subscribe('onDrawCanvas', ({
...@@ -229,10 +234,6 @@ function checkColor (e) { ...@@ -229,10 +234,6 @@ function checkColor (e) {
return [0, 0, 0, 255] return [0, 0, 0, 255]
} }
function TextMetrics (width) {
this.width = width
}
function Pattern (image, repetition) { function Pattern (image, repetition) {
this.image = image this.image = image
this.repetition = repetition this.repetition = repetition
...@@ -257,14 +258,6 @@ var methods3 = ['setFillStyle', 'setTextAlign', 'setStrokeStyle', 'setGlobalAlph ...@@ -257,14 +258,6 @@ var methods3 = ['setFillStyle', 'setTextAlign', 'setStrokeStyle', 'setGlobalAlph
'setTextBaseline', 'setLineDash' 'setTextBaseline', 'setLineDash'
] ]
var tempCanvas
function getTempCanvas () {
if (!tempCanvas) {
tempCanvas = document.createElement('canvas')
}
return tempCanvas
}
class CanvasContext { class CanvasContext {
constructor (id, pageId) { constructor (id, pageId) {
this.id = id this.id = id
...@@ -319,11 +312,9 @@ class CanvasContext { ...@@ -319,11 +312,9 @@ class CanvasContext {
return new Pattern(image, repetition) return new Pattern(image, repetition)
} }
} }
measureText (text) { // TODO
var c2d = getTempCanvas().getContext('2d') // measureText (text) {
c2d.font = this.state.font // }
return new TextMetrics(c2d.measureText(text).width || 0)
}
save () { save () {
this.actions.push({ this.actions.push({
method: 'save', method: 'save',
...@@ -742,10 +733,6 @@ export function createCanvasContext (id, context) { ...@@ -742,10 +733,6 @@ export function createCanvasContext (id, context) {
} }
} }
const {
invokeCallbackHandler: invoke
} = UniServiceJSBridge
export function canvasGetImageData ({ export function canvasGetImageData ({
canvasId, canvasId,
x, x,
...@@ -823,47 +810,27 @@ export function canvasToTempFilePath ({ ...@@ -823,47 +810,27 @@ export function canvasToTempFilePath ({
return return
} }
const cId = canvasEventCallbacks.push(function ({ const cId = canvasEventCallbacks.push(function ({
data, base64
width,
height
}) { }) {
if (!data || !data.length) { if (!base64 || !base64.length) {
invoke(callbackId, { invoke(callbackId, {
errMsg: 'canvasToTempFilePath:fail' errMsg: 'canvasToTempFilePath:fail'
}) })
return
} }
let imgData invokeMethod('base64ToTempFilePath', {
try { base64Data: base64,
imgData = new ImageData(new Uint8ClampedArray(data), width, height) x,
} catch (error) { y,
invoke(callbackId, { width,
errMsg: 'canvasToTempFilePath:fail' height,
}) destWidth,
return destHeight,
} canvasId,
const canvas = getTempCanvas() fileType,
canvas.width = width qualit
canvas.height = height }, callbackId)
const c2d = canvas.getContext('2d')
c2d.putImageData(imgData, 0, 0)
let base64 = canvas.toDataURL('image/png')
const img = new Image()
img.onload = function () {
if (fileType === 'jpeg') {
c2d.fillStyle = '#fff'
c2d.fillRect(0, 0, width, width)
}
c2d.drawImage(img, 0, 0)
base64 = canvas.toDataURL(`image/${fileType}`, qualit)
invoke(callbackId, {
errMsg: 'canvasToTempFilePath:ok',
tempFilePath: base64
})
}
img.src = base64
}) })
operateCanvas(canvasId, pageId, 'getImageData', { operateCanvas(canvasId, pageId, 'getDataUrl', {
x, x,
y, y,
width, width,
...@@ -871,6 +838,8 @@ export function canvasToTempFilePath ({ ...@@ -871,6 +838,8 @@ export function canvasToTempFilePath ({
destWidth, destWidth,
destHeight, destHeight,
hidpi: false, hidpi: false,
fileType,
qualit,
callbackId: cId callbackId: cId
}) })
} }
...@@ -412,7 +412,10 @@ export default { ...@@ -412,7 +412,10 @@ export default {
context.__hidpi__ = true context.__hidpi__ = true
context.drawImageByCanvas(canvas, x, y, width, height, 0, 0, destWidth, destHeight, false) context.drawImageByCanvas(canvas, x, y, width, height, 0, 0, destWidth, destHeight, false)
imgData = context.getImageData(0, 0, destWidth, destHeight) imgData = context.getImageData(0, 0, destWidth, destHeight)
} catch (error) { } catch (error) {
if (!callbackId) {
return
}
UniViewJSBridge.publishHandler('onCanvasMethodCallback', { UniViewJSBridge.publishHandler('onCanvasMethodCallback', {
callbackId, callbackId,
data: { data: {
...@@ -420,16 +423,24 @@ export default { ...@@ -420,16 +423,24 @@ export default {
} }
}, this.$page.id) }, this.$page.id)
return return
}
if (!callbackId) {
return {
data: [...imgData.data],
width: destWidth,
height: destHeight
}
} else {
UniViewJSBridge.publishHandler('onCanvasMethodCallback', {
callbackId,
data: {
errMsg: 'canvasGetImageData:ok',
data: [...imgData.data],
width: destWidth,
height: destHeight
}
}, this.$page.id)
} }
UniViewJSBridge.publishHandler('onCanvasMethodCallback', {
callbackId,
data: {
errMsg: 'canvasGetImageData:ok',
data: [...imgData.data],
width: destWidth,
height: destHeight
}
}, this.$page.id)
}, },
putImageData ({ putImageData ({
data, data,
...@@ -464,6 +475,74 @@ export default { ...@@ -464,6 +475,74 @@ export default {
errMsg: 'canvasPutImageData:ok' errMsg: 'canvasPutImageData:ok'
} }
}, this.$page.id) }, this.$page.id)
},
getDataUrl ({
x = 0,
y = 0,
width,
height,
destWidth,
destHeight,
hidpi = true,
fileType,
qualit,
callbackId
}) {
let res = this.getImageData({
x,
y,
width,
height,
destWidth,
destHeight,
hidpi
})
if (!res.data || !res.data.length) {
UniViewJSBridge.publishHandler('onCanvasMethodCallback', {
callbackId,
data: {
errMsg: 'canvasGetDataUrl:fail'
}
}, this.$page.id)
return
}
let imgData
try {
imgData = new ImageData(new Uint8ClampedArray(res.data), res.width, res.height)
} catch (error) {
UniViewJSBridge.publishHandler('onCanvasMethodCallback', {
callbackId,
data: {
errMsg: 'canvasGetDataUrl:fail'
}
}, this.$page.id)
return
}
destWidth = res.width
destHeight = res.height
const canvas = document.createElement('canvas')
canvas.width = destWidth
canvas.height = destHeight
const c2d = canvas.getContext('2d')
c2d.putImageData(imgData, 0, 0)
let base64 = canvas.toDataURL('image/png')
const img = new Image()
img.onload = () => {
if (fileType === 'jpeg') {
c2d.fillStyle = '#fff'
c2d.fillRect(0, 0, destWidth, destHeight)
}
c2d.drawImage(img, 0, 0)
base64 = canvas.toDataURL(`image/${fileType}`, qualit)
UniViewJSBridge.publishHandler('onCanvasMethodCallback', {
callbackId,
data: {
errMsg: 'canvasGetDataUrl:ok',
base64: base64
}
}, this.$page.id)
}
img.src = base64
} }
} }
} }
......
import {
invoke
} from '../../bridge'
import {
TEMP_PATH
} from '../constants'
/**
* 5+错误对象转换为错误消息
* @param {*} error 5+错误对象
*/
function toErrMsg (error) {
var msg = 'base64ToTempFilePath:fail'
if (error && error.message) {
msg += ` ${error.message}`
} else if (error) {
msg += ` ${error}`
}
return msg
}
export function base64ToTempFilePath ({
base64Data,
x,
y,
width,
height,
destWidth,
destHeight,
canvasId,
fileType,
quality
} = {}, callbackId) {
var id = Date.now()
var bitmap = new plus.nativeObj.Bitmap(`bitmap${id}`)
bitmap.loadBase64Data(base64Data, function () {
var formats = ['jpg', 'png']
var format = String(fileType).toLowerCase()
if (formats.indexOf(format) < 0) {
format = 'png'
}
/**
* 保存配置
*/
var saveOption = {
overwrite: true,
quality: typeof quality === 'number' ? quality * 100 : 100,
format
}
/**
* 保存文件路径
*/
var tempFilePath = `${TEMP_PATH}/canvas/${id}.${format}`
bitmap.save(tempFilePath, saveOption, function () {
clear()
invoke(callbackId, {
tempFilePath,
errMsg: 'base64ToTempFilePath:ok'
})
}, function (error) {
clear()
invoke(callbackId, {
errMsg: toErrMsg(error)
})
})
}, function (error) {
clear()
invoke(callbackId, {
errMsg: toErrMsg(error)
})
})
function clear () {
bitmap.clear()
}
}
export * from './context/audio' export * from './context/audio'
export * from './context/background-audio' export * from './context/background-audio'
export * from './context/canvas'
export * from './context/operate-map-player' export * from './context/operate-map-player'
export * from './context/operate-video-player' export * from './context/operate-video-player'
......
export function operateCanvasContext (canvasId, pageVm, type, data) { const {
const pageId = pageVm.$page.id invokeCallbackHandler: invoke
UniServiceJSBridge.publishHandler(pageId + '-canvas-' + canvasId, { } = UniServiceJSBridge
canvasId,
type, export function base64ToTempFilePath ({
data base64Data,
}, pageId) x,
y,
width,
height,
destWidth,
destHeight,
canvasId,
fileType,
quality
} = {}, callbackId) {
invoke(callbackId, {
errMsg: 'canvasToTempFilePath:ok',
tempFilePath: base64Data
})
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册