You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现16×64二值01数组缩为16×32且保留图形可见性

16×64二值位图水平缩放至16×32实现方案

问题概述

  • 输入:文本文件存储的0、1二值数组,对应16行×64列黑白位图
  • 输出要求:转换为16×32尺寸的0、1字符串数组,缩放后图形清晰可识别,适配单片机开发场景
  • 已验证无效方案:
    • 隔列删除像素方案:图形失真无法识别
    • 相邻像素求和合并方案:代码运行异常,输出空数组
  • 原有异常实现代码:
string[] halfColumnsAndRawsArray = new string[halfRawsArray.Length];
for (int i = 0; i < halfRawsArray.Length; i ++)
{
    char[] beforeEditingStr = halfRawsArray[i].ToCharArray();
    char[] afterEditingStr = new char[beforeEditingStr.Length / 2];
    int c = 0;
    for (int j = 0; j < beforeEditingStr.Length; j += 2)
    {
        int jj = j + 1;
        //if ((j % 2) == 0)
        //{
        int sum = (Convert.ToInt16(beforeEditingStr[j]) + Convert.ToInt16(beforeEditingStr[jj]));
        if (sum == 2) sum = 1;
        afterEditingStr[c] = Convert.ToChar(sum);
        c++;
        //}
    }
    for (int k = 0; k < afterEditingStr.Length; k++)
    {
        halfColumnsAndRawsArray[i] += afterEditingStr[k];
    }
    halfColumnsAndRawsArray[i] += ",   ";
}

原有代码异常根因

  • 字符转换逻辑错误:Convert.ToInt16(char)获取的是字符的ASCII编码值,不是字符代表的数字。字符'0'的ASCII值为48,'1'为49,两个字符相加的结果最小为96,永远不可能满足sum == 2的判断条件。
  • 输出字符错误:计算完成后直接将数字0、1转为char,得到的是ASCII码为0、1的不可见控制字符,不是可见的'0'、'1'字符,最终拼接出的字符串显示为空或乱码。
  • 合并逻辑不合理:原逻辑仅当两个相邻像素都为1时才输出1,很容易丢失单像素宽的细线条、边缘轮廓,导致图形辨识度下降。

修复后可运行代码

合并逻辑采用相邻像素或运算:只要两个相邻像素任意一个为1,输出结果即为1,最大程度保留图形轮廓,避免细线条丢失。

string[] halfColumnsAndRawsArray = new string[halfRawsArray.Length];
for (int i = 0; i < halfRawsArray.Length; i++)
{
    // 去除每行首尾可能存在的空格、换行符,避免长度异常
    char[] beforeEditingStr = halfRawsArray[i].Trim().ToCharArray();
    // 基础校验,避免输入格式错误导致索引越界
    if (beforeEditingStr.Length != 64)
    {
        throw new InvalidDataException($"第{i}行数据长度不符合64列要求");
    }
    
    char[] afterEditingStr = new char[32];
    for (int j = 0; j < 32; j++)
    {
        // 字符转对应数值:ASCII码连续,减'0'即可得到0/1数字
        int pixelLeft = beforeEditingStr[j * 2] - '0';
        int pixelRight = beforeEditingStr[j * 2 + 1] - '0';
        // 或运算合并:任意一个像素为1则结果为1,保留轮廓
        int mergedPixel = pixelLeft | pixelRight;
        // 数值转回'0'/'1'字符
        afterEditingStr[j] = (char)(mergedPixel + '0');
    }
    // 直接构造目标字符串,避免逐字符拼接的空值问题和性能损耗
    halfColumnsAndRawsArray[i] = new string(afterEditingStr) + ",   ";
}

效果说明

  • 无乱码、空输出问题:修正了字符和数字的转换逻辑,输出为标准的'0'、'1'可见字符
  • 图形辨识度高:或运算合并逻辑不会丢失单像素宽的线条、边缘点,缩放后的图形肉眼可清晰识别,效果远好于隔列采样、双1才输出1的合并逻辑
  • 运行稳定:增加了输入长度校验,避免文本中多余的空白字符导致的运行时异常

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:09:15