You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity3D C#生成带Logo二维码:颜色修改与定位图形替换问题

Unity C# 自定义二维码:修改填充色与替换定位方块

嘿,我来帮你搞定这两个二维码定制的问题!咱们一步步来解决:

Q1:把二维码填充色从黑色改成绿色

你用ZXing生成的二维码默认是黑白两色,要把黑色部分换成绿色,只需要在生成像素数组后,遍历每个像素做颜色替换就行。参考derHugo的思路,咱们把这段逻辑加到你的代码里:

首先,修改你的GenerateBarcode方法,在获取pixels数组后、设置到Texture2D之前,加入颜色替换的循环:

private Texture2D GenerateBarcode(string data, BarcodeFormat format, int width, int height) {
    var encodeOptions = new EncodingOptions { Height = height, Width = width, Margin = 0, PureBarcode = false };
    encodeOptions.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    BarcodeWriter writer = new BarcodeWriter { Format = BarcodeFormat.QR_CODE, Options = encodeOptions };
    
    // 生成原始二维码像素(黑白)
    Color32[] pixels = writer.Write(data); // 注意你原来的代码里写的是text,应该改成传入的data哦
    
    // --- 替换颜色部分 ---
    for (var i = 0; i < pixels.Length; i++){
        var pixel = pixels[i];
        // 识别黑色像素(ZXing默认黑是0,0,0)
        if (pixel.r == 0 && pixel.g == 0 && pixel.b == 0) {
            pixel = Color.green; // 换成绿色
        } else {
            pixel = Color.white; // 白色保留,也可以改成你想要的其他底色
        }
        pixels[i] = pixel;
    }
    // --- 颜色替换结束 ---
    
    Texture2D tex = new Texture2D(width, height);
    tex.SetPixels32(pixels);
    tex.Apply();
    return tex;
}

这里要注意,你原来的代码里writer.Write(text)应该是writer.Write(data),不然会报错,我已经帮你修正啦~

Q2:替换二维码侧边的“黑色方块”(定位标记)

QR码的三个定位方块(左上角、右上角、左下角的7x7方块)是ZXing自动生成的,要替换成其他图形,得手动定位这些区域的像素,然后替换成你想要的样式。这里给你两种方案:

方案1:替换为自定义纯色样式(比如蓝边框黄填充)

先定位三个定位块的区域,然后遍历这些区域的像素,修改颜色:

在颜色替换的代码之后,加入这段逻辑:

// --- 替换定位方块部分 ---
int blockSize = 7; // QR码定位块的标准尺寸是7x7

// 处理左上角定位块
ReplacePositionBlock(pixels, width, height, 0, 0, blockSize);
// 处理右上角定位块
ReplacePositionBlock(pixels, width, height, width - blockSize, 0, blockSize);
// 处理左下角定位块
ReplacePositionBlock(pixels, width, height, 0, height - blockSize, blockSize);
// --- 定位方块替换结束 ---

然后实现ReplacePositionBlock方法:

private void ReplacePositionBlock(Color32[] pixels, int texWidth, int texHeight, int startX, int startY, int blockSize) {
    for (int y = 0; y < blockSize; y++) {
        for (int x = 0; x < blockSize; x++) {
            // 计算当前像素在数组中的索引
            int pixelIndex = (startY + y) * texWidth + (startX + x);
            if (pixelIndex < 0 || pixelIndex >= pixels.Length) continue;
            
            // 边框部分(第一行、最后一行、第一列、最后一列)设为蓝色
            if (x == 0 || x == blockSize - 1 || y == 0 || y == blockSize - 1) {
                pixels[pixelIndex] = Color.blue;
            } 
            // 内部区域设为黄色
            else {
                pixels[pixelIndex] = Color.yellow;
            }
        }
    }
}

方案2:替换为自定义图片(比如你的Logo小图标)

如果想用自己的图片替换定位块,先准备一个7x7的Texture2D(命名为positionBlockTexture,可以放在Resources里加载,或者直接在代码中创建),然后把它的像素复制到定位块区域:

// 加载自定义定位块纹理(示例:从Resources加载)
Texture2D positionBlockTexture = Resources.Load<Texture2D>("CustomPositionBlock");
if (positionBlockTexture != null && positionBlockTexture.width == blockSize && positionBlockTexture.height == blockSize) {
    Color32[] blockPixels = positionBlockTexture.GetPixels32();
    
    // 复制到左上角定位块
    CopyBlockToQR(pixels, width, blockPixels, 0, 0, blockSize);
    // 复制到右上角定位块
    CopyBlockToQR(pixels, width, blockPixels, width - blockSize, 0, blockSize);
    // 复制到左下角定位块
    CopyBlockToQR(pixels, width, blockPixels, 0, height - blockSize, blockSize);
}

实现CopyBlockToQR方法:

private void CopyBlockToQR(Color32[] qrPixels, int qrWidth, Color32[] blockPixels, int startX, int startY, int blockSize) {
    for (int y = 0; y < blockSize; y++) {
        for (int x = 0; x < blockSize; x++) {
            int qrIndex = (startY + y) * qrWidth + (startX + x);
            int blockIndex = y * blockSize + x;
            if (qrIndex >= 0 && qrIndex < qrPixels.Length && blockIndex >=0 && blockIndex < blockPixels.Length) {
                qrPixels[qrIndex] = blockPixels[blockIndex];
            }
        }
    }
}

这样就能把自定义的图形替换掉原来的黑色定位方块啦~

内容的提问来源于stack exchange,提问作者HardCoder

火山引擎 最新活动