Files
photobooth/photobooth/camera/CameraGphoto2Cffi.py
2018-07-14 01:09:47 +02:00

115 lines
3.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Photobooth - a flexible photo booth software
# Copyright (C) 2018 Balthasar Reuter <photobooth at re - web dot eu>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import io
import logging
from PIL import Image
import gphoto2cffi as gp
from .CameraInterface import CameraInterface
class CameraGphoto2Cffi(CameraInterface):
def __init__(self):
super().__init__()
self.hasPreview = True
self.hasIdle = True
logging.info('Using gphoto2-cffi bindings')
self._setupCamera()
def cleanup(self):
self._cap.config['imgsettings']['imageformat'].set(self._imgfmt)
self._cap.config['imgsettings']['imageformatsd'].set(self._imgfmtsd)
# self._cap.config['settings']['autopoweroff'].set(self._autopoweroff)
def _setupCamera(self):
self._cap = gp.Camera()
logging.info('Supported operations: %s',
self._cap.supported_operations)
# make sure camera format is not set to raw
imgfmt = 'Large Fine JPEG'
self._imgfmt = self._cap.config['imgsettings']['imageformat'].value
if 'raw' in self._imgfmt.lower():
self._cap.config['imgsettings']['imageformat'].set(imgfmt)
self._imgfmtsd = self._cap.config['imgsettings']['imageformatsd'].value
if 'raw' in self._imgfmtsd.lower():
self._cap.config['imgsettings']['imageformatsd'].set(imgfmt)
# make sure autopoweroff is disabled
# this doesn't seem to work
# self._autopoweroff = int(
# self._cap.config['settings']['autopoweroff'].value)
# if self._autopoweroff > 0:
# self._cap.config['settings']['autopoweroff'].set("0")
# print current config
self._printConfig(self._cap.config)
@staticmethod
def _configTreeToText(config, indent=0):
config_txt = ''
for k, v in config.items():
config_txt += indent * ' '
config_txt += k + ': '
if hasattr(v, '__len__') and len(v) > 1:
config_txt += '\n'
config_txt += CameraGphoto2Cffi._configTreeToText(v,
indent + 4)
else:
config_txt += str(v) + '\n'
return config_txt
@staticmethod
def _printConfig(config):
config_txt = 'Camera configuration:\n'
config_txt += CameraGphoto2Cffi._configTreeToText(config)
logging.info(config_txt)
def setActive(self):
self._cap._get_config()['actions']['viewfinder'].set(True)
self._cap._get_config()['settings']['output'].set('PC')
def setIdle(self):
self._cap._get_config()['actions']['viewfinder'].set(False)
self._cap._get_config()['settings']['output'].set('Off')
def getPreview(self):
return Image.open(io.BytesIO(self._cap.get_preview()))
def getPicture(self):
return Image.open(io.BytesIO(self._cap.capture()))