如何使用python

时间:2018-05-16 11:24:29

标签: python python-2.7 encoding base64 python-imaging-library

我有一个来自设备的数据流,我需要将其转换为jpeg然后base64对其进行编码以通过网络传输它。

到目前为止,我的Python 2.7代码如下所示:

from PIL import Image
import io

image = Image.open(io.BytesIO(self.imagebuffer)) # Image buffer contains the image data from the device.
image.save("test.jpg") # Writes the image to the disk in jpeg format
image.show() # Opens the image using the OS image view

我可以看到我有我想要的图像,可以用jpeg格式将其保存到磁盘上。

我不明白的是,我是否可以对来自image对象的图像进行base64编码,或者是否需要先将其写入磁盘。如果可能的话,我想避免写它。

我的第二个问题是PIL在这个过程中做了什么?它是否正在获取数据并将所需的特殊代码放入文件中以使其成为jpeg文件?我认为他的答案是因为我可以将文件扩展名更改为.bmp并且正确的文件写在磁盘上。

总而言之,是否可以从image对象获取我的jpeg文件的base64编码版本,而无需先将其写入磁盘?

4 个答案:

答案 0 :(得分:0)

一样简单:

import base64

encoded_string = base64.b64encode(image.read())

答案 1 :(得分:0)

试用此代码

图片base64编码格式

Python代码:

import os
import base64

image = 'test.jpg'

encoded_string = ""
with open(image, "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())
    file = encoded_string

答案 2 :(得分:0)

  1. 将img保存在缓冲区中 - 不接触磁盘
  2. jpeg页眉和页脚的正则表达式 - 容错(标题:FF D8 FF,页脚:FF D9)
  3. base64数据
  4. flush to file

答案 3 :(得分:0)

此代码完成工作:

function GetVolumeInformation(
  lpRootPathName: string; lpVolumeNameBuffer: string; nVolumeNameSize: DWORD;
  var lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength: DWORD;
  var lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: string;
  nFileSystemNameSize: DWORD): BOOL;
  external 'GetVolumeInformationW@kernel32.dll stdcall';

const
  MAX_PATH = 260;

function FindVolumeName(const Drive: string): string;
var
  FileSystemFlags: DWORD;
  VolumeSerialNumber: DWORD;
  MaximumComponentLength: DWORD;
begin
  SetLength(Result, MAX_PATH)
  if GetVolumeInformation(
       Drive, Result, Length(Result), VolumeSerialNumber, MaximumComponentLength,
       FileSystemFlags, '', 0) then
  begin
    SetLength(Result, Pos(#0, Result) - 1);
  end
    else
  begin
    RaiseException(SysErrorMessage(DLLGetLastError()));
  end
end;