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
相关产品推荐
相关产品推荐

