文档管理中心

如何将码图背景颜色设置成透明色

问题现象

当前码图生成不支持设置背景颜色为透明色。

解决措施

通过图片处理将码图的背景颜色转换为透明色。

示例代码(仅供参考):

收起
自动换行
深色代码主题
复制
  1. import { image } from '@kit.ImageKit';
  2. import { hilog } from '@kit.PerformanceAnalysisKit';
  3. /**
  4. * 通过传入createBarcode生成的PixelMap对象及其背景色,获取透明背景色的PixelMap对象
  5. *
  6. * @param {image.PixelMap} originalPixelMap - createBarcode生成的PixelMap对象。
  7. * @param {number} backgroundColor - CreateOptions设置的十六进制背景色。
  8. * @returns {Promise<image.PixelMap | undefined>} 成功返回新的PixelMap对象,失败则返回undefined。
  9. */
  10. export async function convertBackgroundColorToTransparent(originalPixelMap: image.PixelMap,
  11. backgroundColor: number): Promise<image.PixelMap | undefined> {
  12. try {
  13. // 获取图像信息
  14. const imageInfo: image.ImageInfo = await originalPixelMap.getImageInfo();
  15. // 创建缓冲区以存储像素数据
  16. const buffer: ArrayBuffer = new ArrayBuffer(originalPixelMap.getPixelBytesNumber());
  17. // 将像素数据读取到缓冲区
  18. originalPixelMap.readPixelsToBufferSync(buffer);
  19. // 初始化新像素图的选项
  20. const options: image.InitializationOptions = {
  21. editable: true,
  22. srcPixelFormat: imageInfo.pixelFormat,
  23. pixelFormat: imageInfo.pixelFormat,
  24. size: imageInfo.size
  25. };
  26. // 创建新的可编辑PixelMap对象
  27. let newPixelMap: image.PixelMap = image.createPixelMapSync(buffer, options);
  28. // 定义码图图片数据区域
  29. const area: image.PositionArea = {
  30. pixels: new ArrayBuffer(imageInfo.size.height * imageInfo.size.width * 4), // 像素数据缓冲区
  31. offset: 0, // 偏移量
  32. stride: imageInfo.stride, // 间距
  33. region: { size: { height: imageInfo.size.height, width: imageInfo.size.width }, x: 0, y: 0 } // 区域
  34. };
  35. // 将区域数据转换为 Uint8Array
  36. let areaUint8Array: Uint8Array = new Uint8Array(area.pixels);
  37. let originalPixelMapUint8Array: Uint8Array = new Uint8Array(buffer);
  38. // 从backgroundColor中提取红、绿、蓝通道的值
  39. const redBg: number = (backgroundColor >> 16) & 0xFF;
  40. const greenBg: number = (backgroundColor >> 8) & 0xFF;
  41. const blueBg: number = backgroundColor & 0xFF;
  42. // 遍历像素
  43. for (let i = 0; i < originalPixelMapUint8Array.length; i += 4) {
  44. const red: number = originalPixelMapUint8Array[i];
  45. const green: number = originalPixelMapUint8Array[i + 1];
  46. const blue: number = originalPixelMapUint8Array[i + 2];
  47. // 直接复制红绿蓝通道
  48. areaUint8Array[i] = red;
  49. areaUint8Array[i + 1] = green;
  50. areaUint8Array[i + 2] = blue;
  51. // 检查像素是否为背景色
  52. if (red === redBg && green === greenBg && blue === blueBg) {
  53. areaUint8Array[i + 3] = 0; // 设置透明色
  54. } else {
  55. areaUint8Array[i + 3] = originalPixelMapUint8Array[i + 3]; // 保留原透明度
  56. }
  57. }
  58. // 写入新像素数据
  59. await newPixelMap.writePixels(area);
  60. // 返回新的PixelMap对象
  61. return newPixelMap;
  62. } catch (err) {
  63. hilog.error(0x0001, 'CreateBarcode', `Failed to convertBackgroundColorToTransparent. Code: ${err.code}.`);
  64. return undefined;
  65. }
  66. }
请输入您想要搜索的关键词