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

如何在未知尺寸下用Pillow从二进制字符串还原原始图像?

无原始尺寸信息下从二进制字符串还原清晰图像

问题背景

用户使用以下Python代码从二进制字符串还原灰度图像:

def binaire2image(binaires):
    r = 100
    while True:
        
        try:
            c = len(binaires) // 8 // r
            v = [binaires[i:i+8] for i in range(0, len(binaires), 8)]
            d = [int(n, 2) for n in v]
            arr = np.array(d).reshape((r, c))
            image = Image.fromarray(arr.astype(np.uint8), mode='L')
            return image
        except ValueError:
            r += 1

当前代码存在的问题:无原始图像尺寸信息时生成的图像模糊,仅当设置的行数r接近原图的180时才能得到清晰结果,需要实现无需尺寸信息即可还原清晰图像的方案。

解决方案

核心思路

原始图像的总像素数是固定值(等于二进制字符串长度除以8),我们需要从总像素数的所有因数对中,筛选出符合常见图像宽高比、视觉合理的尺寸组合,而非盲目递增尝试行数。

具体实现

import numpy as np
from PIL import Image

def binaire2image(binaires):
    total_pixels = len(binaires) // 8
    if total_pixels == 0:
        raise ValueError("二进制字符串长度不足,无法转换为图像")
    
    # 生成所有可能的宽高因数对
    factor_pairs = []
    sqrt_total = int(np.sqrt(total_pixels))
    for r in range(1, sqrt_total + 1):
        if total_pixels % r == 0:
            c = total_pixels // r
            factor_pairs.append((r, c))
            if r != c:
                factor_pairs.append((c, r))
    
    # 筛选有效尺寸:排除过小尺寸,优先匹配常见宽高比
    valid_pairs = []
    common_ratios = [(4/3, 3/4), (16/9, 9/16), (1, 1)]  # 覆盖常见的4:3、16:9、正方形比例
    min_side = 50  # 最小边长阈值,避免生成极小无意义图像
    
    for r, c in factor_pairs:
        if r < min_side or c < min_side:
            continue
        current_ratio = r / c
        # 检查是否接近常见比例(允许0.1的误差范围)
        for target in common_ratios:
            if abs(current_ratio - target) < 0.1:
                valid_pairs.append((r, c))
                break
        else:
            # 不匹配常见比例时,保留接近正方形的组合
            if abs(current_ratio - 1) < 0.5:
                valid_pairs.append((r, c))
    
    # 兜底逻辑:若无筛选结果,保留所有符合最小边长的组合
    if not valid_pairs:
        valid_pairs = [(r, c) for r, c in factor_pairs if r >= min_side and c >= min_side]
    
    # 最终兜底:若仍无结果,选择最接近平方根的因数对
    if not valid_pairs:
        r_opt = sqrt_total
        while total_pixels % r_opt != 0:
            r_opt += 1
        c_opt = total_pixels // r_opt
        valid_pairs.append((r_opt, c_opt))
    
    # 选择第一个有效尺寸(可根据需求调整选择逻辑,比如优先更大的边长)
    r, c = valid_pairs[0]
    
    # 二进制转像素数组并生成图像
    pixel_values = [int(binaires[i:i+8], 2) for i in range(0, len(binaires), 8)]
    img_array = np.array(pixel_values).reshape((r, c)).astype(np.uint8)
    return Image.fromarray(img_array, mode='L')

方案优势

  • 不再盲目尝试行数,通过因数分析直接定位合理尺寸
  • 优先匹配常见图像比例,最大程度还原原始图像的宽高比
  • 多层兜底逻辑确保无论何种像素总数,都能生成有效且视觉合理的图像
  • 避免因宽高比例严重失调导致的图像模糊问题

内容的提问来源于stack exchange,提问作者Hal.Zed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:08:33