我正在尝试将使用PIL加载的iamge转换为Cimg图像对象。据我所知,Cimg是一个c ++库,PIL是一个python成像库。给定一个图像网址,我的目的是计算图像的pHash而不将其写入磁盘。 pHash模块使用Cimg image object,它已在C ++中实现。所以我打算使用python扩展绑定将我的python程序中所需的图像数据发送到c ++程序。在下面的代码片段中,我将从给定的URL加载图像:
//python code sniplet
import PIL.Image as pil
file = StringIO(urlopen(url).read())
img = pil.open(file).convert("RGB")
我需要构建的Cimg图像对象如下所示:
CImg ( const t *const values,
const unsigned int size_x,
const unsigned int size_y = 1,
const unsigned int size_z = 1,
const unsigned int size_c = 1,
const bool is_shared = false
)
我可以使用img.size获取width(size_x)和height(size_y)并将其传递给c ++。我不确定如何填充Cimg对象的'values'字段?使用什么样的数据结构将图像数据从python传递到c ++代码?
另外,还有其他方法可以将PIL图像转换为Cimg吗?
答案 0 :(得分:0)
我假设你的主应用程序是用Python编写的,你想从Python调用C ++代码。您可以通过创建“Python module”来实现这一点,该“{{3}}”将所有本机C / C ++功能公开给Python。您可以使用SWIG等工具来简化工作。
这是我想到的问题的最佳解决方案。
答案 1 :(得分:0)
将图像从Python传递到基于C ++ CImg的程序的最简单方法是通过管道。
因此,这是一个基于C ++ CImg的程序,可从stdin
读取图像并将虚拟pHash返回给Python调用者-以便您可以看到其工作原理:
#include "CImg.h"
#include <iostream>
using namespace cimg_library;
using namespace std;
int main()
{
// Load image from stdin in PNM (a.k.a. PPM Portable PixMap) format
cimg_library::CImg<unsigned char> image;
image.load_pnm("-");
// Save as PNG (just for debug) rather than generate pHash
image.save_png("result.png");
// Send dummy result back to Python caller
std::cout << "pHash = 42" << std::endl;
}
这是一个Python程序,可以从URL下载图像,将其转换为PNM / PPM(“ Portable PixMap” ),并将其发送到C ++程序,以便它可以生成并返回pHash:
#!/usr/bin/env python3
import requests
import subprocess
from PIL import Image
from io import BytesIO
# Grab image and open as PIL Image
url = 'https://i.stack.imgur.com/DRQbq.png'
response = requests.get(url)
img = Image.open(BytesIO(response.content)).convert('RGB')
# Generate in-memory PPM image which CImg can read without any libraries
with BytesIO() as buffer:
img.save(buffer,format="PPM")
data = buffer.getvalue()
# Start CImg passing our PPM image via pipe (not disk)
with subprocess.Popen(["./main"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) as proc:
(stdout, stderr) = proc.communicate(input=data)
print(f"Returned: {stdout}")
如果运行Python程序,则会得到:
Returned: b'pHash = 42\n'