0

背景:我正在尝试使用 python 为亚马逊制作 FNSKU 标签,我对图像进行了太多操作,所以我无法选择使用来自卖家中心的标签,我需要以某种方式创建它们。

问题:亚马逊给出的标签又好又小: https ://i.stack.imgur.com/hlgPA.jpg

我生成的标签太大:https ://i.stack.imgur.com/8ME1X.png

我已经尝试调整图像大小并使用条形码字体,但最终都没有扫描,我如何编码看起来像第一个示例的条形码?

这些是我尝试过的模块:

报告实验室:

from reportlab.pdfgen import canvas 
from reportlab.graphics.barcode import code128 
from reportlab.lib.units import mm 
c = canvas.Canvas("BRC.pdf") 
c.setPageSize(57*mm, 32*mm) barcode = code128.Code128("X001SB7OYL", 
barHeight=.9*inch,barWidth = 1.2) 
barcode.drawOn(c, 2*mm, 20*mm) c.showPage() c.save()

-- 在这里将代码调整为更小不起作用,代码不可读。

我还使用了带有如下代码的 python-barcode:

code128(u'X001SB7OYL', writer=ImageWriter())

同样的问题,一旦我调整它的大小,它就不会被扫描。

4

3 回答 3

0

如果我理解问题,这就是解决方案。此代码剪切图像的水平部分。

from PIL import Image
from numpy import array, delete
from copy import deepcopy


def img_to_mat(img):
    return array(img)


def mat_to_img(mat, encoding='RGB'):
    """
    input: zeros((h, w, 3), dtype=uint8)
    return: img
    """
    return Image.fromarray(mat, encoding)


def cut(img, h1, h2):
    """ cut lines from h1 to h2 of img """
    mat = deepcopy(img_to_mat(img))

    for i in range(h2 - h1):
        mat = delete(mat, h1, axis=0)

    return mat_to_img(mat)


# Load image
path = 'gallery\\bar2.png'
Im = Image.open(path)

# cut from up to down
Im = cut(Im, 200, 240)
Im = cut(Im, 50, 170)

Im.save(path.split('.')[0] + '-new.' + path.split('.')[1])
Im.show()

示例值针对您的特定示例图像进行了调整。

于 2018-08-13T12:09:04.107 回答
0

您可以像 Omar 所说的那样删除原始图像的部分。

一个更简单的方法是:

file = 'barcode.png' # path to saved barcode

img = Image.open(file)

img1 = img.crop((0, 0, 402, 50)) # crop image into the 3 required sections
img2 = img.crop((0, 170, 402, 200))
img3 = img.crop((0, 240, 402, 270))

image = Image.new('RGB', (402, 110))

image.paste(img1, (0, 0, 402, 50)) # stich the cropped images together
image.paste(img2, (0, 50, 402, 80))
image.paste(img3, (0, 80, 402, 110))

image.thumbnail((222, 222), Image.NEAREST)
image.save(file)
于 2018-08-13T12:37:11.913 回答
0

您生成的条形码版本存在两个问题:

  • 它的比例与所需的形状不同 - 您可以通过选择较小的条形高度(并可能更改可绘制对象的高度)来纠正它。我不知道是什么影响了条形码和它下面的文字之间的距离,它也太大了。

  • 它总体上比所需的宽。你说如果你通过改变参数把它变小,它就变得不可扫描了。你能用大约 37 毫米的可绘制宽度发布结果吗?如果问题是由于分辨率有限而导致线条的位置不精确,您可以通过最初将图像渲染得较大(但按比例放大,因此它不会太高并且文本靠近条形码)然后使用一个具有不错的抗锯齿缩小功能(例如 ImageMagick)的库,可以将其缩放到您想要的确切大小。

于 2018-08-13T12:23:19.550 回答