如何使用 Wand 从二进制字符串创建高分辨率 JPEG

2024-02-13

我正在尝试使用 imagemagick 将一些 PDF 转换为高分辨率 jpeg 。我正在使用 python 3.62 - 64 位和 wand 0.4.4 开发 win 10、64。在命令行我有:

$ /e/ImageMagick-6.9.9-Q16-HDRI/convert.exe -density 400 myfile.pdf -scale 2000x1000 test3.jpg.

这对我来说效果很好。

在Python中:

from wand.image import Image

file_path = os.path.dirname(os.path.abspath(__file__))+os.sep+"myfile.pdf"

with Image(filename=file_path, resolution=400) as image:
    image.save()
    image_jpeg = image.convert('jpeg')

这给了我低分辨率的 JPEG。我如何将其翻译成我的魔杖代码来完成同样的事情?

edit:

我意识到问题在于输入 pdf 必须作为二进制字符串读入 Image 对象,因此基于http://docs.wand-py.org/en/0.4.4/guide/read.html#read-blob http://docs.wand-py.org/en/0.4.4/guide/read.html#read-blob我试过:

with open(file_path,'rb') as f:
    image_binary = f.read()

f.close()

with Image(blob=image_binary,resolution=400) as img:
    img.transform('2000x1000', '100%')
    img.make_blob('jpeg')
    img.save(filename='out.jpg')

这可以正常读取文件,但输出被分成 10 个文件。为什么?我需要将其转换为 1 个高分辨率 jpeg。

EDIT:

我需要将 jpeg 发送到 OCR api,所以我想知道是否可以将输出写入类似对象的文件。看着https://www.imagemagick.org/api/magick-image.php#MagickWriteImageFile https://www.imagemagick.org/api/magick-image.php#MagickWriteImageFile, 我试过 :

emptyFile =  Image(width=1500, height=2000)

with Image(filename=file_path, resolution=400) as image:

    library.MagickResetIterator(image.wand)
    # Call C-API Append method.
    resource_pointer = library.MagickAppendImages(image.wand,
                                                  True)

    library.MagickWriteImagesFile(resource_pointer,emptyFile)

这给出:

 File "E:/ENVS/r3/pdfminer.six/ocr_space.py", line 113, in <module>
test_file = ocr_stream(filename='test4.jpg')
 File "E:/ENVS/r3/pdfminer.six/ocr_space.py", line 96, in ocr_stream
library.MagickWriteImagesFile(resource_pointer,emptyFile)
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type

我怎样才能让它发挥作用?


为什么?我需要将其转换为 1 个高分辨率 jpeg。

PDF 包含 ImageMagick 将各个图像视为“堆栈”的页面。这wand /questions/tagged/wand图书馆提供了一个wand.image.Image.sequance处理每个页面。

然而,要附加all图像转换为单个 JPEG。您可以迭代每个页面并将它们缝合在一起,或者调用 C-API 的方法MagickAppendImages.

from wand.image import Image
from wand.api import library
import ctypes

# Map C-API not provided by wand library.
library.MagickAppendImages.argtypes = [ctypes.c_void_p, ctypes.c_int]
library.MagickAppendImages.restype = ctypes.c_void_p

with Image(filename="path_to_document.pdf", resolution=400) as image:
    # Do all your preprocessing first
    # Ether word directly on the wand instance, or iterate over each page.
    # ...
    # To write all "pages" into a single image.
    # Reset the stack iterator.
    library.MagickResetIterator(image.wand)                    
    # Call C-API Append method.
    resource_pointer = library.MagickAppendImages(image.wand,
                                                  True)        
    # Write C resource directly to disk.
    library.MagickWriteImages(resource_pointer,                
                              "output.jpeg".encode("ASCII"),
                              False)

Update:

我需要将 jpeg 发送到 OCR api ...

假设您使用 OpenCV 的 python API,您只需要迭代每个页面,并通过 numpy 缓冲区将图像文件数据传递到 OCR。

from wand.image import Image
import numpy
import cv2

def ocr_process(file_data_buffer):
     """ Replace with whatever your OCR-API calls for """
     mat_instance = cv2.imdecode(file_data_buffer)
     # ... work ...

source_image="path_to_document.pdf"
with Image(filename=source_image, resolution=400) as img:
    for page in img.sequence:
        file_buffer = numpy.asarray(bytearray(page.make_blob("JPEG")),
                                    dtype=numpy.uint8)
        ocr_process(file_buffer)

所以我想知道是否可以将输出写入类似对象的文件

不要假设来自不同库的 python“图像”对象(或下划线 C 结构)彼此具有可比性。

如果不了解 OCR api,我无法帮助您通过wand /questions/tagged/wand部分,但我可以建议以下之一......

  • 使用临时中间文件。 (I/O 较慢,但更容易学习/开发/调试)

    with Image(filename=INPUT_PATH) as img:
        # work
        img.save(filename=OUTPUT_PATH)
    # OCR work on OUTPUT_PATH
    
  • 如果 OCR API 支持,请使用文件描述符。 (同上)

    with open(INPUT_PATH, 'rb') as fd:
        with Image(file=fd) as img:
            # work
            # OCR work ???
    
  • 使用斑点。 (更快的 I/O 但需要lot更多内存)

    buffer = None
    with Image(filename=INPUT_PATH) as img:
        # work
        buffer = img.make_blob(FORMAT)
    if buffer:
        # OCR work ???
    

更多更新

将所有评论放在一起,解决方案可能是......

from wand.image import Image
from wand.api import library
import ctypes
import requests

# Map C-API not provided by wand library.
library.MagickAppendImages.argtypes = [ctypes.c_void_p, ctypes.c_int]
library.MagickAppendImages.restype = ctypes.c_void_p

with Image(filename='path_to_document.pdf', resolution=400) as image:
    # ... Do pre-processing ...
    # Reset the stack iterator.
    library.MagickResetIterator(image.wand)
    # Call C-API Append method.
    resource_pointer = library.MagickAppendImages(image.wand, True)
    # Convert to JPEG.
    library.MagickSetImageFormat(resource_pointer, b'JPEG')
    # Create size sentinel.
    length = ctypes.c_size_t()
    # Write image blob to memory.
    image_data_pointer = library.MagickGetImagesBlob(resource_pointer,
                                                     ctypes.byref(length))
    # Ensure success
    if image_data_pointer and length.value:
        # Create buffer from memory address
        payload = ctypes.string_at(image_data_pointer, length.value)
        # Define local filename.
        payload_filename = 'my_hires_image.jpg'
        # Post payload as multipart encoded image file with filename.
        requests.post(THE_URL, files={'file': (payload_filename, payload)})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Wand 从二进制字符串创建高分辨率 JPEG 的相关文章

  • Spark 请求最大计数

    我是 Spark 的初学者 我尝试请求允许我检索最常访问的网页 我的要求如下 mostPopularWebPageDF logDF groupBy webPage agg functions count webPage alias cntW
  • Python中Decimal类型的澄清

    每个人都知道 或者至少 每个程序员都应该知道 http docs oracle com cd E19957 01 806 3568 ncg goldberg html 即使用float类型可能会导致精度错误 然而 在某些情况下 精确的解决方
  • python future 和元组解包

    实现像使用 future 进行元组解包这样的事情的优雅 惯用的方法是什么 我有这样的代码 a b c f x y g a b z h y c 我想将其转换为使用期货 理想情况下我想写一些类似的东西 a b c ex submit f x y
  • 如何在序列化器创建方法中获取 URL Id?

    我有以下网址 url r member P
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来
  • 更改 `base_compiledir` 以将编译后的文件保存在另一个目录中

    theano base compiledir指编译后的文件存放的目录 有没有办法可以永久设置theano base compiledir到不同的位置 也许通过修改一些内部 Theano 文件的内容 http deeplearning net
  • 如何通过在 Python 3.x 上按键来启动和中断循环

    我有这段代码 当按下 P 键时会中断循环 但除非我按下非 P 键 否则循环不会工作 def main openGame while True purchase imageGrab if a sum gt 1200 fleaButton ti
  • Python urllib.request.urlopen:AttributeError:'bytes'对象没有属性'data'

    我正在使用 Python 3 并尝试连接到dstk 我收到错误urllib包裹 我对SO进行了很多研究 但找不到与这个问题类似的东西 api url self api base street2coordinates api body jso
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • 在 pytube3 中获取 youtube 视频的标题?

    我正在尝试构建一个应用程序来使用 python 下载 YouTube 视频pytube3 但我无法检索视频的标题 这是我的代码 from pytube import YouTube yt YouTube link print yt titl
  • 无法在 osx-arm64 上安装 Python 3.7

    我正在尝试使用 Conda 创建一个带有 Python 3 7 的新环境 例如 conda create n qnn python 3 7 我收到以下错误 Collecting package metadata current repoda
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • 在Python中按属性获取对象列表中的索引

    我有具有属性 id 的对象列表 我想找到具有特定 id 的对象的索引 我写了这样的东西 index 1 for i in range len my list if my list i id specific id index i break
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 如何使用 Google Translator Api 将转换后的英文文本设置到另一个文本框?

    我有两个文本框 一个用于英语 另一个用于印地语 当我在第一个框中输入英语时 文本应在第二个框中显示为印地语版本 在按键事件上 我已经提到了一个例子如何在您的网站中通过 Google API 将英语翻译成印地语 http arunsonare
  • 单选按钮检查事件处理

    在我的应用程序中 我需要一个单选组 每当选中单选按钮时 就会出现警报 以便我可以使用 jQuery 将其值发布到 ajax post 你能帮我看看我如何在 jQuery 中做到这一点吗 尝试这样的事情 function input type
  • 使用自签名证书是否可以防止中间人攻击?

    我不确定以前是否有人问过类似的问题 我找不到任何问题 但是是否可以保护客户端 服务器免受中间人攻击 我正在编写一个客户端应用程序来与服务器进行通信 通信将基于 SSLv3 我对服务器的自签名证书没问题 但担心其他人以相同的服务器名称生成相同
  • 推送到 git 时出现非快进错误

    我得到了一个non fast forward尝试推送到 WordPress git 存储库时出错 但像错误消息所说的那样拉动会给我一条消息 表明一切都是最新的 这是在拉取 合并和提交之后 这是我的日志 http pastebin com 6
  • linux任务集:多线程进程的线程是否始终在特定核心上运行?

    我使用任务集设置多线程进程在 Linux 主机上运行 如下所示 任务 c 1 2 myprocess 特定线程是否总是在特定 CPU 上运行 例如线程 1 总是在 c1 上运行 或者它会在不同时间在 c1 或 c2 上运行 不 过滤器应用于
  • VueJs 模板。如何加载外部模板

    我是 Vue js 的新手 我使用 AngularJS 一段时间了 在 Angular 中我们用来加载模板 例如 template sometemplate html controller someCtrl 我们如何在 Vue 中做这样的事
  • 如何根据我的应用程序版本自动设置 Inno Setup 安装程序的版本?

    我正在使用 Inno Setup 来生成我的应用程序的安装程序 如何设置setup exe的版本号 VersionInfoVersion 由 Inno 生成以自动与我的应用程序的版本号匹配 现在 每次部署应用程序的新版本时 我都需要手动更新
  • 防止出现滚动条时居中布局移动其位置

    我的页面布局看起来像这样的东西 http jsfiddle net salman qxywp show div div 您会注意到 当垂直滚动条出现时 内容换行 div 的位置稍微移动了一点 一种情况是当浏览器开始逐步呈现页面而不显示垂直滚
  • 测试 Windows 安装程序

    我在一家软件公司工作 我们有一个适用于 Windows 操作系统的产品 可以使用自定义安装程序进行安装 我们希望拥有一个每天运行安装程序的自动化系统 确保所有内容均已安装且正常运行 应用程序已安装 出现在 添加 删除 中 创建快捷方式 创建
  • 如何在Processing中创建3D平台游戏,包括玩家移动、熔岩和移动块障碍物?

    这非常重要请帮忙 我想在这段代码中添加以下功能 我创建的玩家可以停留在我创建的阶段的顶部 并且无法通过它 如果玩家触及熔岩 游戏就会停止并写上 你输了 如果玩家来到我按下熔岩时创建的终端平台 你赢了 写下来 让我创建的阶段在 y 轴上上下移
  • 使用笑话模拟时出现打字稿错误

    我有一个之前创建的 js文件模拟了我们的一些功能jest测试目的 我正在将其迁移到 ts file 服务器 ts const Server jest genMockFromModule Server Server getAsync Serv
  • Haskell 中 split 的一行实现

    我想要的是以下内容 我认为应该包含在序言中 因为它在文本处理中非常有用 split Eq a gt a gt a gt a e g split hello world hello world split from Data List Uti
  • 在 RecyclerView 或 Grouping Recyclerview items 中按组划分元素,例如按日期

    我想对我的 android 进行分组RecyclerView带有基于日期的标题的项目 如下所示 1 week ago item item item item 2 weeks ago item item item 这类事情或基于某些元素的分组
  • 如何找到两个字符串之间的值?

    我如何 查找 和 获取 两个字符串之间的值 ie a 3 a 我正在读取文件以查找位置 a 从哪里开始 那么当它找到时就会停止读取 a 我想要返回的值是 3 使用 JRE 6 您的两个主要选择是 1 首选但可能很复杂 使用 XML HTML
  • SDLC 的敏捷与螺旋模型 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我相信敏捷只不过是螺旋模型的另一种实现 我从一开始就是 Spiral 的大力支持者 螺旋模型是一种结合了设计和阶段原型制作元素的软件开发过
  • 如何通过谷歌分析知道有多少收件人打开了电子邮件?

    我正在使用 swiftmailer 一个用于在 php 中发送邮件的库 问题是 我已经注册了一个谷歌分析帐户 如何使用此工具查看有多少人打开了电子邮件 谢谢 Updated 好吧 trackcode 在 js 中 肯定行不通 如果用户允许
  • 如何将 MS SQL Server 一个数据库中的所有表的所有列名更改为大写?

    是否有任何sql语句用于将数据库中所有表的所有列名更改为大写 微软 SQL 服务器 我有一个sql来做到这一点 但不确定它是否正确 运行下面的 SQL select exec sp rename b name a name UPPER a
  • 在 VSTS 构建过程中使用“dotnet pack”将构建号添加到包版本

    使用 NET Framework 库 您可以使用通配符指定版本 NUGET pack 命令将在 VSTS 中运行 NUGET 构建任务时自动附加构建日期和版本 assembly AssemblyVersion 1 0 NUGET PACK
  • 编译js失败反应本机预期缓冲区大小

    我的代码工作正常 然后突然开始显示如下错误 编译JS失败 180820 25 预期缓冲区大小 7070676 开头为 并具有保护模式 r p Error Screenshot 我尝试重置缓存 npx react native start r
  • 如何使用 Wand 从二进制字符串创建高分辨率 JPEG

    我正在尝试使用 imagemagick 将一些 PDF 转换为高分辨率 jpeg 我正在使用 python 3 62 64 位和 wand 0 4 4 开发 win 10 64 在命令行我有 e ImageMagick 6 9 9 Q16