- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Pillow 创建一个 PNG。 PNG 稍后用于标签打印。因此,我尝试使用 PIL
创建一个新图像,添加一些文本、一个多边形和一个二维码。但是,我发现很难获得合适的图像尺寸(与 7.5 cm x 5.5 cm 的标签尺寸相关)。我只是通过尝试和错误到达那里(它大致是 (275, 204)
)。保存时,PNG 的分辨率很差,打印时也是如此。
如何正确计算图像大小以及如何提高分辨率以将图像另存为 PNG(或 JPG 或 JPEG)。
到目前为止,这是我的代码:
import qrcode
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
# Create qr code instance
qr = qrcode.QRCode(
version = 1,
error_correction = qrcode.constants.ERROR_CORRECT_H,
box_size = 4,
border = .2,
)
text = "test"
# Create new image
img = Image.new('RGB', (275, 204), color = (220,220,220))
# Add data
qr.add_data(text)
qr.make(fit=True)
# Create an image from the QR Code instance
qrc = qr.make_image(fill_color='black', back_color='white')
draw = ImageDraw.Draw(img)
font1 = ImageFont.truetype("arial.ttf", 25)
font2 = ImageFont.truetype("arial.ttf", 60)
draw.text((65, 150),text,(0,0,0),font=font1)
draw.text((115, 120),text,(0,0,0),font=font2)
draw.polygon(((5, 20), (50, 34), (50, 6)), fill=0)
img.paste(qrc, (80,25))
img.show()
#img.save("image.png", dpi = (300,300))
最佳答案
您需要为所有要绘制的元素设置相对(标签)坐标和大小(以厘米为单位),然后计算相应的图像坐标和大小(以像素为单位)w.r.t.所需的分辨率。这会以某种方式变得麻烦,但我想不出另一种独立于分辨率的方法。
在下文中,我省略了整个 QR 码,以确保内容至少具有一点可读性。
为了比较,您的代码(没有二维码)在我的机器上生成了这张图片:
如果我在 Photoshop 中打开该图像,它显示 9.7 cm x 7.2 cm at 72 dpi。如果我手动计算分辨率,我将得到以下结果:
275 pixels / 7.5 cm * (2.54 cm/inch) = ca. 93 dpi
204 pixels / 5.5 cm * (2.54 cm/inch) = ca. 94 dpi
稍后我们将需要 94 dpi。
我根据您的原始图像估算了相对(标签)坐标和大小。
现在,首先让我们看一下整个代码:
from PIL import Image, ImageDraw, ImageFont
# Set up parameters
w_cm, h_cm = (7.5, 5.5) # Real label size in cm
res_x, res_y = (300, 300) # Desired resolution
res_y_old = 94 # Old y resolution (204 / 5.5 * 2.54)
# Inch-to-cm factor
f = 2.54
# Determine image size w.r.t. resolution
w = int(w_cm / f * res_x)
h = int(h_cm / f * res_y)
# Create new image with proper size
img = Image.new('RGB', (w, h), color=(220, 220, 220))
# Draw elements
draw = ImageDraw.Draw(img)
def draw_text(x_cm, y_cm, font_size):
font = ImageFont.truetype('arial.ttf', int(font_size / (res_y_old / res_y)))
x, y = (int(x_cm / f * res_x), int(y_cm / f * res_y))
draw.text((x, y), 'test', (0, 0, 0), font=font)
# Draw texts
draw_text(1.875, 4, 25)
draw_text(3.15, 3.25, 60)
# Polygon
coords_cm = [(0.15, 0.5), (1.35, 0.9), (1.35, 0.1)]
coords = [(int(c[0] / f * res_x), int(c[1] / f * res_y)) for c in coords_cm]
draw.polygon(tuple(coords), fill=(0, 0, 0))
# Save image
img.save('image.png', dpi=(res_x, res_y))
然后,让我们看看输出:
如果我在 Photoshop 中打开该图像,它显示 7.5 cm x 5.5 cm at 300 dpi,这正是我们想要的。
关于字体大小:我想,您手动设置这些字体大小以获得特定的外观。不幸的是,以磅为单位的字体大小被调整为在显示器上具有一定的高度,但它们不会缩放以进行打印(或“打印”图像)。这就是为什么,我们需要缩放字体 w.r.t。旧分辨率和新分辨率,以保持原始图像所需的文本外观。
其他一切都是重复转换相对坐标和大小。如果需要进一步的解释,请随时询问!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.5
Pillow: 8.1.0
----------------------------------------
关于python - 如何正确创建具有所需大小和分辨率(PNG、JPG、JPEG)的新图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62690745/
我正在使用 JavaFX 开发视频播放器。我正在将视频从本地文件系统加载到 JavaFX 类媒体中。然后我想获取宽度和高度,以便我可以将场景的尺寸设置为该大小: Media media = new M
我是OpenCV的新手,正在尝试解决这个问题。我有一个.mp4文件保存在从网络摄像头流式传输的磁盘上。现在,我需要制作视频的低分辨率版本,以上传到Web服务器(这个想法是,低分辨率预览实时或多或少地上
我在我的应用程序中使用 jfree 图表(折线图)...创建时我的图表看起来很模糊...我怎样才能获得高清晰度图像。 我使用过:ChartUtilities.writeScaledChartAsPNG
我正在用 Java 编写一个工具来处理我网站上上传的文件。我想以特定的方式管理图像:如果尺寸大于限制,我想首先调整图像的尺寸,然后再次检查尺寸。当然,我不想做无用的工作,所以我想在调整图像大小之前估计
是否有一种纯 WPF 方法来获取有关所有可用显示器大小(分辨率)的信息。我知道我可以使用 Screen.AllScreens 来获取它们,但在我的遗留项目中我无法添加新的引用(内置 WPF 程序集除外
看了Developer文档,部分理解了LDPI,HDPI,MDPI,XHDPI类比,网上到处找也没有找到具体答案。 我有两部手机,一部是小屏幕,一部是平板电脑。我希望我的小屏幕手机上的按钮看起来很小,
对于下面给定的网页, xyz {% load staticfiles %} html, body {
我在 Mac 上使用多个 JFrames 制作了一个程序,分辨率还可以,一切都适合屏幕。但是,当我在我的 PC 上运行该程序时,JFrames 太大并且会立即离开屏幕。 我的问题是:是否可以在 JFr
我需要有关如何检索屏幕分辨率的帮助,如下图所示。 我找到了 this documentation这真的很有帮助。这是我根据这些文档尝试的代码: int numberOfScreens = GetSys
有什么方法可以更改分辨率或为亚马逊 Kindle 键盘上的屏幕设置不同的边界?我的屏幕有一部分出现裂纹,我想解决这个问题。 我试过在文件系统中乱搞(通过 WiFi 连接),但我的所有属性更改都没有任何
快速提问, 我正在开发 libgdx 中的游戏,但遇到了问题。我正在尝试扩展我的 Assets ,我正在使用 Gdx.graphics.getDensity() 来获取密度,然后使用它作为乘数来设置我
我有一些关于屏幕分辨率的问题,我不清楚。这些问题假设我的应用程序将在 iOS 4.0 及更高版本以及 iPhone 3GS 或 iPhone 4 上运行。 启动图像 (default.png) 的大小
我们有一个应用程序在审核过程中被 Apple 应用程序审核人员拒绝。拒绝的原因是应用程序在 Ipad 上运行时无法正确缩放。 该应用程序本来就不是要在 Ipad 上运行的,但与他们争论这一点似乎没有意
我试图在不解码文件的情况下获取 JPEG 图像的分辨率。我从互联网上获得了几个样本,但没有一个可以正常工作。似乎是这样,因为许多 JPEG 文件不是标准的,尽管任何图形应用程序(Irfan、PSP、F
我尝试了很多事情,但是所有尝试都失败了。 我需要将灰度图像(2560x1440)调整为更低或更高的分辨率,然后我需要将边界设置为原始大小(2560x1440),但将调整后的图像保持在中心。 我使用的是
我正在使用 GLSulfaceView 开发一个静音相机应用程序,该应用程序从预览中捕获图片。 为了捕捉图片,我使用 GLES20.glReadPixels(0, 0, surfaceWidth, s
是否有相当于 yarn resolutions 的 npm功能? npm package.json docs 中没有提及它. 例如,我想在 3.3.2 上安装 lerna@3.3.2 及其依赖项之一
我制作了一个在 Arduino 上运行的 24x15 LED 显示屏,去年我在内存中放入了 32KB 的图形例程,这很酷。 但现在我已经升级到 Arduino Mega,具有 256KB 内存,并且有
我的场景是,我正在收集网络数据包,如果数据包与网络过滤器匹配,我想记录连续数据包之间的时间差,最后一部分是不起作用的部分。我的问题是,无论我使用什么 C 定时器函数,我都无法获得准确的亚秒级测量。我尝
我们一直在学校布置一项任务,需要更改图像(反转颜色、切换颜色、旋转 90 度、双倍大小、放大图像),现在我正在尝试通过将分辨率加倍来使其大小加倍,但无法弄清楚如何访问该地址并更改它。我们得到了两个函数
我是一名优秀的程序员,十分优秀!