|
3 | 3 | * |
4 | 4 | * NodeJS QRCode generator. Can save image or svg to file, get standard base64 image data url text or get SVG serialized text. Cross-browser QRCode generator for pure javascript. Support Dot style, Logo, Background image, Colorful, Title etc. settings. support binary mode.(Running without DOM on server side) |
5 | 5 | * |
6 | | - * Version 4.0.0 |
| 6 | + * Version 4.1.0 |
7 | 7 | * |
8 | 8 | |
9 | 9 | * |
@@ -1129,7 +1129,7 @@ Drawing.prototype.draw = function(oQRCode) { |
1129 | 1129 | // JPG |
1130 | 1130 | if (_htOption.format == 'JPG') { |
1131 | 1131 |
|
1132 | | - if (_htOption.quietZoneColor == 'transparent') { |
| 1132 | + if (_htOption.quietZoneColor == "rgba(0,0,0,0)") { |
1133 | 1133 | _htOption.quietZoneColor = '#ffffff'; |
1134 | 1134 | } |
1135 | 1135 |
|
@@ -1196,61 +1196,70 @@ Drawing.prototype.draw = function(oQRCode) { |
1196 | 1196 |
|
1197 | 1197 | var eye = oQRCode.getEye(row, col); // { isDark: true/false, type: PO_TL, PI_TL, PO_TR, PI_TR, PO_BL, PI_BL }; |
1198 | 1198 |
|
| 1199 | + var nowDotScale = _htOption.dotScale; |
| 1200 | + |
1199 | 1201 | if (eye) { |
1200 | 1202 | // Is eye |
1201 | 1203 | bIsDark = eye.isDarkBlock; |
1202 | 1204 | var type = eye.type; |
| 1205 | + if (type == 'AO') { |
| 1206 | + nowDotScale = _htOption.dotScaleAO; |
| 1207 | + } else if (type == 'AI') { |
| 1208 | + nowDotScale = _htOption.dotScaleAI; |
| 1209 | + } else { |
| 1210 | + nowDotScale = 1; |
| 1211 | + } |
1203 | 1212 |
|
1204 | 1213 | // PX_XX, PX, colorDark, colorLight |
1205 | 1214 | var eyeColorDark = _htOption[type] || _htOption[type.substring(0, 2)] || _htOption.colorDark; |
1206 | | - |
1207 | 1215 | _oContext.lineWidth = 0; |
1208 | 1216 | _oContext.strokeStyle = bIsDark ? eyeColorDark : _htOption.colorLight; |
1209 | 1217 | _oContext.fillStyle = bIsDark ? eyeColorDark : _htOption.colorLight; |
1210 | 1218 |
|
1211 | | - _oContext.fillRect(nLeft, _htOption.titleHeight + nTop, nWidth, nHeight); |
1212 | | - |
| 1219 | + _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + nHeight * (1 - nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); |
1213 | 1220 | } else { |
1214 | 1221 | _oContext.lineWidth = 0; |
1215 | 1222 | _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; |
1216 | 1223 | _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; |
1217 | 1224 |
|
1218 | | - var nowDotScale = _htOption.dotScale; |
| 1225 | + if (_htOption.backgroundImage) { |
| 1226 | + |
| 1227 | + if (_htOption.autoColor) { |
| 1228 | + _oContext.strokeStyle = bIsDark ? autoColorDark : autoColorLight; |
| 1229 | + _oContext.fillStyle = bIsDark ? autoColorDark : autoColorLight; |
| 1230 | + } else { |
| 1231 | + _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; |
| 1232 | + _oContext.strokeStyle = _oContext.fillStyle; |
| 1233 | + } |
| 1234 | + } else { |
| 1235 | + _oContext.strokeStyle = _oContext.fillStyle; |
| 1236 | + |
| 1237 | + } |
| 1238 | + |
1219 | 1239 | if (row == 6) { |
1220 | 1240 | // Timing Pattern |
1221 | | - nowDotScale = 1; |
1222 | | - var timingHColorDark = _htOption.timing_H || _htOption.timing || _htOption.colorDark; |
1223 | | - _oContext.fillStyle = bIsDark ? timingHColorDark : _htOption.colorLight; |
1224 | | - _oContext.strokeStyle = _oContext.fillStyle; |
| 1241 | + nowDotScale = _htOption.dotScaleTiming_H; |
| 1242 | + |
1225 | 1243 | _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + |
1226 | 1244 | nHeight * (1 - |
1227 | 1245 | nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); |
1228 | 1246 | } else if (col == 6) { |
1229 | 1247 | // Timing Pattern |
1230 | | - nowDotScale = 1; |
1231 | | - var timingVColorDark = _htOption.timing_V || _htOption.timing || _htOption.colorDark; |
1232 | | - _oContext.fillStyle = bIsDark ? timingVColorDark : _htOption.colorLight; |
1233 | | - _oContext.strokeStyle = _oContext.fillStyle; |
| 1248 | + nowDotScale = _htOption.dotScaleTiming_V; |
| 1249 | + |
1234 | 1250 | _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + |
1235 | 1251 | nHeight * (1 - |
1236 | 1252 | nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); |
1237 | 1253 | } else { |
1238 | 1254 |
|
1239 | 1255 | if (_htOption.backgroundImage) { |
1240 | 1256 |
|
1241 | | - if (_htOption.autoColor) { |
1242 | | - _oContext.strokeStyle = bIsDark ? autoColorDark : autoColorLight; |
1243 | | - _oContext.fillStyle = bIsDark ? autoColorDark : autoColorLight; |
1244 | | - } else { |
1245 | | - _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; |
1246 | | - _oContext.strokeStyle = _oContext.fillStyle; |
1247 | | - } |
1248 | 1257 | _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + |
1249 | 1258 | nHeight * (1 - |
1250 | 1259 | nowDotScale) / 2, nWidth * nowDotScale, nHeight * nowDotScale); |
1251 | 1260 |
|
1252 | 1261 | } else { |
1253 | | - _oContext.strokeStyle = _oContext.fillStyle; |
| 1262 | + |
1254 | 1263 |
|
1255 | 1264 | _oContext.fillRect(nLeft + nWidth * (1 - nowDotScale) / 2, _htOption.titleHeight + nTop + |
1256 | 1265 | nHeight * (1 - |
@@ -1470,10 +1479,18 @@ function QRCode(vOption) { |
1470 | 1479 | colorLight: "#ffffff", |
1471 | 1480 | correctLevel: QRErrorCorrectLevel.H, |
1472 | 1481 |
|
1473 | | - dotScale: 1, // Must be greater than 0, less than or equal to 1. default is 1 |
| 1482 | + dotScale: 1, // For body block, must be greater than 0, less than or equal to 1. default is 1 |
| 1483 | + |
| 1484 | + dotScaleTiming: 1, // Dafault for timing block , must be greater than 0, less than or equal to 1. default is 1 |
| 1485 | + dotScaleTiming_H: undefined, // For horizontal timing block, must be greater than 0, less than or equal to 1. default is 1 |
| 1486 | + dotScaleTiming_V: undefined, // For vertical timing block, must be greater than 0, less than or equal to 1. default is 1 |
| 1487 | + |
| 1488 | + dotScaleA: 1, // Dafault for alignment block, must be greater than 0, less than or equal to 1. default is 1 |
| 1489 | + dotScaleAO: undefined, // For alignment outer block, must be greater than 0, less than or equal to 1. default is 1 |
| 1490 | + dotScaleAI: undefined, // For alignment inner block, must be greater than 0, less than or equal to 1. default is 1 |
1474 | 1491 |
|
1475 | 1492 | quietZone: 0, |
1476 | | - quietZoneColor: 'transparent', |
| 1493 | + quietZoneColor: "rgba(0,0,0,0)", |
1477 | 1494 |
|
1478 | 1495 | title: "", |
1479 | 1496 | titleFont: "bold 16px Arial", |
@@ -1570,6 +1587,66 @@ function QRCode(vOption) { |
1570 | 1587 | " , is invalidate, dotScale must greater than 0, less than or equal to 1, now reset to 1. ") |
1571 | 1588 | this._htOption.dotScale = 1; |
1572 | 1589 | } |
| 1590 | + |
| 1591 | + if (this._htOption.dotScaleTiming < 0 || this._htOption.dotScaleTiming > 1) { |
| 1592 | + console.warn(this._htOption.dotScaleTiming + |
| 1593 | + " , is invalidate, dotScaleTiming must greater than 0, less than or equal to 1, now reset to 1. " |
| 1594 | + ) |
| 1595 | + this._htOption.dotScaleTiming = 1; |
| 1596 | + } |
| 1597 | + if (this._htOption.dotScaleTiming_H) { |
| 1598 | + if (this._htOption.dotScaleTiming_H < 0 || this._htOption.dotScaleTiming_H > 1) { |
| 1599 | + console.warn(this._htOption.dotScaleTiming_H + |
| 1600 | + " , is invalidate, dotScaleTiming_H must greater than 0, less than or equal to 1, now reset to 1. " |
| 1601 | + ) |
| 1602 | + this._htOption.dotScaleTiming_H = 1; |
| 1603 | + } |
| 1604 | + } else { |
| 1605 | + this._htOption.dotScaleTiming_H = this._htOption.dotScaleTiming; |
| 1606 | + } |
| 1607 | + |
| 1608 | + if (this._htOption.dotScaleTiming_V) { |
| 1609 | + if (this._htOption.dotScaleTiming_V < 0 || this._htOption.dotScaleTiming_V > 1) { |
| 1610 | + console.warn(this._htOption.dotScaleTiming_V + |
| 1611 | + " , is invalidate, dotScaleTiming_V must greater than 0, less than or equal to 1, now reset to 1. " |
| 1612 | + ) |
| 1613 | + this._htOption.dotScaleTiming_V = 1; |
| 1614 | + } |
| 1615 | + } else { |
| 1616 | + this._htOption.dotScaleTiming_V = this._htOption.dotScaleTiming; |
| 1617 | + } |
| 1618 | + |
| 1619 | + |
| 1620 | + |
| 1621 | + if (this._htOption.dotScaleA < 0 || this._htOption.dotScaleA > 1) { |
| 1622 | + console.warn(this._htOption.dotScaleA + |
| 1623 | + " , is invalidate, dotScaleA must greater than 0, less than or equal to 1, now reset to 1. " |
| 1624 | + ) |
| 1625 | + this._htOption.dotScaleA = 1; |
| 1626 | + } |
| 1627 | + if (this._htOption.dotScaleAO) { |
| 1628 | + if (this._htOption.dotScaleAO < 0 || this._htOption.dotScaleAO > 1) { |
| 1629 | + console.warn(this._htOption.dotScaleAO + |
| 1630 | + " , is invalidate, dotScaleAO must greater than 0, less than or equal to 1, now reset to 1. " |
| 1631 | + ) |
| 1632 | + this._htOption.dotScaleAO = 1; |
| 1633 | + } |
| 1634 | + } else { |
| 1635 | + this._htOption.dotScaleAO = this._htOption.dotScaleA; |
| 1636 | + } |
| 1637 | + if (this._htOption.dotScaleAI) { |
| 1638 | + if (this._htOption.dotScaleAI < 0 || this._htOption.dotScaleAI > 1) { |
| 1639 | + console.warn(this._htOption.dotScaleAI + |
| 1640 | + " , is invalidate, dotScaleAI must greater than 0, less than or equal to 1, now reset to 1. " |
| 1641 | + ) |
| 1642 | + this._htOption.dotScaleAI = 1; |
| 1643 | + } |
| 1644 | + } else { |
| 1645 | + this._htOption.dotScaleAI = this._htOption.dotScaleA; |
| 1646 | + } |
| 1647 | + |
| 1648 | + |
| 1649 | + |
1573 | 1650 | if (this._htOption.backgroundImageAlpha < 0 || this._htOption.backgroundImageAlpha > 1) { |
1574 | 1651 | console.warn(this._htOption.backgroundImageAlpha + |
1575 | 1652 | " , is invalidate, backgroundImageAlpha must between 0 and 1, now reset to 1. ") |
|
0 commit comments