Hallo, framp, danke für deine schnelle Antwort. Ich bin Anfänger. Hab über das Pi-Buch darüber gelesen. Deswegen auch meine Fragen. Möchte ungern unnötig Geld ausgeben. Hast du vielleich eine Empfelung für den USB-Wlan-Adapter?
Schau dir mal den an.
Hallo, framp, danke für deine schnelle Antwort. Ich bin Anfänger. Hab über das Pi-Buch darüber gelesen. Deswegen auch meine Fragen. Möchte ungern unnötig Geld ausgeben. Hast du vielleich eine Empfelung für den USB-Wlan-Adapter?
Schau dir mal den an.
XAUTHORITY=home...
Fehlt da evtl. ein / hinter dem = ?
Empfehle aber auch systemd
Den sleep auf 15 Sekunden zu erhöhen war die Lösung. Warum auch immer.
DISPLAY=:0.0 XAUTHORITY=home/Kindergarten/.Xauthority /usr/bin/fehl -q -p -Z -F -R 60 -Y -D 10.0 /media/Kindergarten/USB-STICK/
Ich gehe mal davon aus, dass Du feh meinst und das "l" zu viel ist.
Ja, ich weiß nicht wo das L herkommt. Im Skript ist es nicht.
Ich glaube nicht, dass es an der Hardware liegt.
Probiere doch mal das Script über eine .desktop in .config/autostart starten zu lassen.
Oder per systemd.
Beides hat leider nicht funktioniert. Ich habe daraufhin den sleep auf 15 Sekunden erhöht. Das hat dann geholfen. Danke für deinen input!
Hallo zusammen,
ich hänge hier an einem digitalen Bilderrahmen für den Kindergarten.
Ich habe ein simples Script welches beim Autostart starten soll und die Bilder des Vortags von einem USB Stick aus starten soll:
#!/bin/bash
DISPLAY=:0.0 XAUTHORITY=home/Kindergarten/.Xauthority /usr/bin/fehl -q -p -Z -F -R 60 -Y -D 10.0 /media/Kindergarten/USB-STICK/
die rc.local habe ich mit nano folgendermaßen bearbeitet:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
sleep 10
bash /home/Kindergarten/slideshow.sh &
exit 0
Display More
Über bash lässt sich das Script starten.
Wenn ich mich auslogge und wieder einlogge funktioniert es ebenfalls.
Kann mir hier jemand weiterhelfen?
Nein, sollte nur der Aufruf von main() gewesen sein.
Das mit dem from __future__ import print_function ist ein Überbleibsel von Python 2.7.
Den Callback könnte man so machen:
Code Display Moredef button_pressed(button): # button wird der Callback-Funktion übergeben, wenn die Funktion # ein Argument erwartet # die Funktion kann man direkt aufrufen button.current_function() # und danach eine andere Funktion zuweisen if button.current_function is preview: button.current_function = main elif button.current_function is main: button.current_function = preview # dann müsste beim ersten mal drücken preview aufgerufen werden # danach main und dann wieder preview usw..
Habe den Code heute morgen ähnlich umgeschrieben:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob, os
import datetime
from gpiozero import Button
#import RPi.GPIO as GPIO
from PIL import Image
import shutil
import picamera
from picamera import PiCamera
import time
import datetime
import shlex
import subprocess
import pyqrcode
import png
import pyautogui
import socket
button = Button(2)
Popen = subprocess.Popen
www = '/var/www/html/aktuelleBilder/'
aktpic = '/home/pi/Desktop/Photobox/aktiv/aktuelleBilder/'
homepath = '/home/pi/Photobox/aktiv/Bambus/'
basis = '/home/pi/Photobox/aktiv/Bambus/basis/'
ready = '/home/pi/Photobox/aktiv/Bambus/ready/'
qrlocation = (1005, 640)
graficsize = (1280, 1024)
camera = PiCamera()
def wait():
# Pfad zum Bild
wait_image_path = homepath + "warten.png"
# Vorschaubild
commandwait = ["feh", "--auto-zoom", "--fullscreen", "--hide-pointer", "--slideshow-delay", "5", wait_image_path]
# Prozess starten
processwait = subprocess.Popen(commandwait)
def slideshow():
#Pfad zum Dia-Archiv:
dia_path = homepath + "Dia/"
commanddia = ["feh", "--auto-zoom", "--fullscreen", "--hide-pointer", "--slideshow-delay", "5", "--reverse", dia_path]
# Prozess starten
processslideshow = subprocess.Popen(commanddia)
while True:
if button.is_pressed:
processslideshow.terminate()
camera.start_preview()
photobox()
def display_preview():
# Pfad zum Bild
image_path = "/home/pi/Photobox/02-preview.jpg"
# Vorschaubild
commandpreview = ["feh", "--auto-zoom", "--fullscreen", "--hide-pointer", "--slideshow-delay", "5", image_path]
# Prozess starten
processpreview = subprocess.Popen(commandpreview)
# Warten für 5 Sekunden
time.sleep(5)
# Prozess beenden
processpreview.terminate()
def display_werbung():
# Pfad zum Bild
image_path = homepath + "werbung.png"
# Vorschaubild
commandwerbung = ["feh", "--auto-zoom", "--fullscreen", "--hide-pointer", "--slideshow-delay", "5", image_path]
# Prozess starten
processwerbung = subprocess.Popen(commandwerbung)
# Warten für 5 Sekunden
time.sleep(5)
# Prozess beenden
processwerbung.terminate()
#Ipadresse abrufen
def get_ip_address(interface):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80)) # Verbindung zu einem externen Server herstellen
ip_address = s.getsockname()[0]
s.close()
return ip_address
except socket.error:
return -1
eth0_ip = -1
while (eth0_ip == -1):
eth0_ip = get_ip_address("eth0")
wlan0_ip = get_ip_address("wlan0")
eth0_ip = get_ip_address("eth0")
wlan0_ip = get_ip_address("wlan0")
# Verstecke den Mauszeiger
pyautogui.FAILSAFE = False
pyautogui.moveTo(0, 0, duration=0)
def preview():
camera.resolution = (1280, 1024)
camera.start_preview()
camera.annotate_text = 'Kalibrierungsmodus'
button.wait_for_press()
camera.annotate_text = ''
time.sleep(1)
def photobox():
timestr = time.strftime('%Y%m%d%H%M%S')
camera.resolution = (graficsize)
camera.awb_mode = 'flash'
camera.iso = 0
camera.hflip = True
#Start Countdown\
for i in range(3,0,-1):
img01 = Image.open('/home/pi/Photobox/DarkOakCountdown/x0' + str(i) + '.png')
pad = Image.new('RGB', (
((img01.size[0] + 31) // 32) * 32,
((img01.size[1] + 15) // 16) * 16,
))
pad.paste(img01, (0, 0))
o01 = camera.add_overlay(pad.tobytes(), size=img01.size)
o01.alpha = 70
o01.layer = 3
if i == 0:
time.sleep(0.0)
else:
time.sleep(0.75)
camera.remove_overlay(o01)
camera.resolution = (2560, 2048)
camera.stop_preview()
camera.capture(aktpic + 'bild_{}.jpg'.format(timestr))
camera.close()
image = Image.open(aktpic + 'bild_{}.jpg'.format(timestr))
image = image.transpose(Image.FLIP_LEFT_RIGHT)
image.save(basis + 'bild_{}.jpg'.format(timestr), quality=100)
size = (graficsize)
image = Image.open(basis +'bild_{}.jpg'.format(timestr))
image.thumbnail(size, Image.ANTIALIAS)
background = Image.new('RGBA', size, (255, 255, 255, 0))
background.paste(
image, (int((size[0] - image.size[0]) / 2), int((size[1] - image.size[1]) / 2))
)
foreground1 = Image.open(homepath + 'overlay_qr.png')
image.paste(foreground1, (0, 0), foreground1)
image.save(www +'bild_{}.jpg'.format(timestr), quality = 100)
#Create QR-Code
QR = pyqrcode.create('http://' + eth0_ip + '/aktuelleBilder/bild_{}.jpg'.format(timestr), error='H', mode='binary')
QR.png('/var/www/html/qr.png', scale=3)
size = (graficsize)
image = Image.open(basis +'bild_{}.jpg'.format(timestr))
image.thumbnail(size, Image.ANTIALIAS)
background = Image.new('RGBA', size, (255, 255, 255, 0))
background.paste(
image, (int((size[0] - image.size[0]) / 2), int((size[1] - image.size[1]) / 2))
)
foreground1 = Image.open(homepath + '/overlay_preview.png')
image.paste(foreground1, (0, 0), foreground1)
image.save('/home/pi/Photobox/01-preview.jpg')
preview = Image.open('/home/pi/Photobox/01-preview.jpg')
qrcodejpg = Image.open('/var/www/html/qr.png')
im01 = preview.copy()
im01.paste(qrcodejpg, qrlocation)
im01.save('/home/pi/Photobox/02-preview.jpg')
# Vorschaubild und Werbung aufrufen
display_preview()
display_werbung()
size = (graficsize)
image = Image.open(basis + 'bild_{}.jpg'.format(timestr))
image.thumbnail(size, Image.ANTIALIAS)
background = Image.new('RGBA', size, (255, 255, 255, 0))
background.paste(
image, (int((size[0] - image.size[0]) / 2), int((size[1] - image.size[1]) / 2))
)
foreground1 = Image.open(homepath + '/overlay_slideshow.png')
image.paste(foreground1, (0, 0), foreground1)
image.save(homepath + '/Dia/bild_{}.jpg'.format(timestr))
im02 = Image.open(homepath + '/Dia/bild_{}.jpg'.format(timestr))
im02.paste(qrcodejpg, qrlocation)
im02.save(homepath + '/Dia/bild_{}.jpg'.format(timestr))
os.remove(aktpic + 'bild_{}.jpg'.format(timestr))
slideshow()
# Button-Callback-Funktion
def button_pressed():
# Überprüfe, welche Funktion gerade aktiv ist
if button_pressed.current_function == preview:
# Beende die Vorschau und starte die Fotobox Hauptfunktion
button_pressed.current_function = photobox()
time.sleep(1)
elif button_pressed.current_function == photobox:
#Starte Fotobox Hauptfunktion neu
button_pressed.current_function = photobox()
# Erstelle den Button
#button = Button(2) # Pin-Nummer anpassen
# Setze die Startfunktion auf die Vorschau
button_pressed.current_function = preview
# Weise den Button der Button-Callback-Funktion zu
button.when_pressed = button_pressed
# Starte die Vorschau
wait()
preview()
# Warte, bis das Skript beendet wird
while True:
time.sleep(1)
Display More
Bekomme beim Neustart der Photobox Hauptfunktion nun die Meldung, dass die Kamera geschlossen ist. Diese öffne ich aber bereits in der Funktion "Siideshow" wieder.
Funktioniert aber seltsamerweise trotzdem.
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/gpiozero/pins/rpigpio.py", line 223, in _call_when_changed
super(RPiGPIOPin, self)._call_when_changed()
File "/usr/lib/python3/dist-packages/gpiozero/pins/local.py", line 130, in _call_when_changed
self.state if state is None else state)
File "/usr/lib/python3/dist-packages/gpiozero/pins/pi.py", line 298, in _call_when_changed
method(ticks, state)
File "/usr/lib/python3/dist-packages/gpiozero/input_devices.py", line 182, in _pin_changed
self._fire_events(ticks, bool(self._state_to_value(state)))
File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 401, in _fire_events
self._fire_activated()
File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 447, in _fire_activated
super(HoldMixin, self)._fire_activated()
File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 364, in _fire_activated
self.when_activated()
File "/home/pi/Photobox/testphotobox.py", line 240, in button_pressed
button_pressed.current_function = photobox()
File "/home/pi/Photobox/testphotobox.py", line 131, in photobox
camera.resolution = (graficsize)
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 2264, in _set_resolution
self._check_camera_open()
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 540, in _check_camera_open
raise PiCameraClosed("Camera is closed")
picamera.exc.PiCameraClosed: Camera is closed
Display More
Chris1893 Ein Fehler der beim drüberschauen sofort aufgefallen ist: `main()` wird in `main()` aufgerufen. Rekursion ist kein Ersatz für eine einfache Schleife. Das geht nur eine bestimmte Anzahl von Aufrufen gut, und dann kracht es. Und auch aus anderen Funktionen sollte `main()` nicht aufgerufen werden — schon gar nicht aus anderen Threads heraus. Funktionen werden aufgerufen, machen etwas, und kehren dann zum Aufrufer zurück.
Das ``from __future__ import print_function`` macht keinen Sinn.
Auf Modulebene werden Dinge getan die da nicht hingehören. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
from __future__ import print_function ist noch ein Überbleibsel. Danke.
Dass main() in main() aufgerufen wird ist ebenfalls zu korrigieren, das stimmt - und auch dass da Dinge auf Ebenen stehen die man da üblicherweise nicht hinpackt. Das ist sehr nett von dir, dass du mich darauf hinweist. Aber so richtig hat das mit meinem ursprünglichen Problem nichts zu tun, oder?
Hallo,
ich habe ein merkwürdiges Problem.
Ich habe ein Script, welches die PiCamera in einem Kalibrierungsmodus startet. Sobald die Schärfe-Einstellungen der HQ-Kamera vorgenommen wurden, drückt man einen Button und startet das Hauptprogramm einer Fotobox.
Bei manuellem starten des Scripts per Thonny ist das kein Problem, alles funktioniert. Per Autostart oder Terminal allerdings nicht. Jemand eine Idee? Hier kommt nach dem Kalibrierungsmodus und dem Knopfdruck der MMAL "Out of Ressources"-Error.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from __future__ import print_function
import glob, os
import datetime
from gpiozero import Button
from PIL import Image
import shutil
import picamera
from picamera import PiCamera
import time
import datetime
import shlex
import subprocess
import pyqrcode
import png
import pyautogui
import socket
#Ipadresse abrufen
def get_ip_address(interface):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80)) # Verbindung zu einem externen Server herstellen
ip_address = s.getsockname()[0]
s.close()
return ip_address
except socket.error:
return None
eth0_ip = get_ip_address("eth0")
wlan0_ip = get_ip_address("wlan0")
Popen = subprocess.Popen
www = '/var/www/html/aktuelleBilder/'
aktpic = '/home/pi/Desktop/Photobox/aktiv/aktuelleBilder/'
homepath = '/home/pi/Photobox/aktiv/Bambus/'
basis = '/home/pi/Photobox/aktiv/Bambus/basis/'
ready = '/home/pi/Photobox/aktiv/Bambus/ready/'
qrlocation = (1005, 640)
#qrlocation = (1168, 570)
# Verstecke den Mauszeiger
pyautogui.FAILSAFE = False
pyautogui.moveTo(0, 0, duration=0)
command = 'feh -F -s /home/pi/Photobox/aktiv/Bambus/warten.png'
wait = Popen(shlex.split(command))
def main():
value = 0
command1 = 'feh -F -D 8 -n /home/pi/Photobox/aktiv/Bambus/Dia/'
slideshow = Popen(shlex.split(command1))
while True:
if button.is_pressed:
slideshow.terminate()
photobox()
main()
time.sleep(0.03)
#Kalibrierungsmodus
def preview():
camera = PiCamera()
camera.resolution = (1280, 1024)
camera.start_preview()
camera.annotate_text = 'Kalibrierungsmodus'
button.wait_for_press()
camera.stop_preview()
camera.close()
#Start des Hauptprogramms
def photobox():
timestr = time.strftime('%Y%m%d%H%M%S')
camera.start_preview()
camera.resolution = (1280, 1024)
camera.awb_mode = 'flash'
camera.iso = 0
camera.exposure_mode = 'sports'
camera.hflip = True
# camera.vflip = True
camera.rotation = 20
Display More
..... (der Ablauf der Fotobox ist jetzt vermutlich nicht so relevant
)
Die Zuweisung der Funktionen und GPIO...
# Button-Callback-Funktion
def button_pressed():
# Überprüfe, welche Funktion gerade aktiv ist
if button_pressed.current_function == preview:
# Beende die Vorschau und starte die Fotobox
button_pressed.current_function = main
main()
elif button_pressed.current_function == main:
# Beende die Fotobox und starte die Vorschau
button_pressed.current_function = main
main()
# Erstelle den Button
button = Button(2) # Pin-Nummer anpassen
# Setze die Startfunktion auf die Vorschau
button_pressed.current_function = preview
# Weise den Button der Button-Callback-Funktion zu
button.when_pressed = button_pressed
# Starte die Vorschau
preview()
# Warte, bis das Skript beendet wird
while True:
time.sleep(1)
Display More
Hat jemand ne Idee wie ich das Problem beseitigt bekomme?
Schöne Grüße, Chris
Schau dir mal greenshot an. Ist sehr gut und du kannst auch Screenshots mit Pullen-menü machen.
Wo kann ich die Auslastung des Videochips auslesen?
Eine Schleife ist eine gute Idee. Da muss ich mich mal mit beschäftigen wenn ich etwas mehr Zeit und den Kopf dafür frei hab.
Hallo, für deinen Vorhaben. Nimm einen Raspberry Pi und IoBroker. Ich habe das auch bei mir installiert und muss sagen es läuft und funktioniert fantastisch. Ich habe ein Phoscon ConBee II ZigBee Stick angeschlossen.
Allerdings solltest du dich etwas mit dem programmieren auskennen. Schau dir im Internet oder auf youtube, wie man mit blockly programmiert. Wenn du daran Spass hast, dann kannst du dein Projekt ruhig anfangen.
Danke.
Schau dir mal die alten Videos von verdrahtet und heim-automatisierung.com auf Youtube an. Super zum Einstieg in die iobroker Welt. Das Ganze ist relativ simpel. Viel Einarbeitungszeit braucht man nicht.
Vor Blockly brauchst du keine Angst haben. Sehr intuitiv.
Bei mir meldet sich bspw. Alexa wenn das Telefon klingelt mit dem jeweiligen Anrufer der im Telefonbuch auf der Fritzbox hinterlegt ist.
Das Foto vom türspion kannst du bspw. Per telegram aufs Handy bekommen
Hallo zusammen,
ich habe ein Problem: Ich würde in meiner Kamera-Preview ein Countdown einblenden. Der zählt dann von 7 - 1 runter und das Bild wird geschossen.
Dabei wird ein Bild dauerhaft im Hintergrund des Countdowns eingeblendet.
Hier der entsprechende Code:
camera = PiCamera()
camera.start_preview()
camera.resolution = (2880, 1800)
camera.awb_mode = 'flash'
camera.iso = 0
camera.hflip = True
camera.rotation = 20
#Start Countdown\oob
imgob = Image.open("/home/pi/Photobox/DarkOakCountdown/overlayback.png")
pad = Image.new('RGB', (
((imgob.size[0] + 31) // 32) * 32,
((imgob.size[1] + 15) // 16) * 16,
))
pad.paste(imgob, (0, 0))
oob = camera.add_overlay(pad.tobytes(), size=imgob.size)
oob.alpha = 128
oob.layer = 3
time.sleep(1.25)
#Start Countdown\07
img07 = Image.open("/home/pi/Photobox/DarkOakCountdown/x07.png")
pad = Image.new('RGB', (
((img07.size[0] + 31) // 32) * 32,
((img07.size[1] + 15) // 16) * 16,
))
pad.paste(img07, (0, 0))
o07 = camera.add_overlay(pad.tobytes(), size=img07.size)
o07.alpha = 128
o07.layer = 3
time.sleep(1.25)
camera.remove_overlay(o07)
#Start Countdown\06
img06 = Image.open("/home/pi/Photobox/DarkOakCountdown/x06.png")
pad = Image.new('RGB', (
((img06.size[0] + 31) // 32) * 32,
((img06.size[1] + 15) // 16) * 16,
))
pad.paste(img06, (0, 0))
o06 = camera.add_overlay(pad.tobytes(), size=img06.size)
o06.alpha = 128
o06.layer = 3
time.sleep(1.25)
camera.remove_overlay(o06)
....
Display More
Overlayback.png wird angezeigt. die Datei x07. png wird allerdings nicht überblendet sondern die Vorschau bricht ab mit folgender Fehlermeldung:
mmal: mmal_vc_port_enable: failed to enable port vc.ril.video_render:in:0(RGB3): ENOMEM
mmal: mmal_port_enable: failed to enable port vc.ril.video_render:in:0(RGB3)(0x2243cb0) (ENOMEM)
Traceback (most recent call last):
File "/home/pi/Desktop/Photobooth_new.py", line 326, in <module>
photobox()
File "/home/pi/Desktop/Photobooth_new.py", line 109, in photobox
o07 = camera.add_overlay(pad.tobytes(), size=img07.size)
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 892, in add_overlay
renderer = PiOverlayRenderer(self, source, size, format, **options)
File "/usr/lib/python3/dist-packages/picamera/renderers.py", line 428, in __init__
self.renderer.inputs[0].enable(callback=lambda port, buf: True)
File "/usr/lib/python3/dist-packages/picamera/mmalobj.py", line 1249, in enable
prefix="Unable to enable port %s" % self.name)
File "/usr/lib/python3/dist-packages/picamera/exc.py", line 184, in mmal_check
raise PiCameraMMALError(status, prefix)
picamera.exc.PiCameraMMALError: Unable to enable port vc.ril.video_render:in:0: Out of memory
Display More
Hat mir jemand eine Lösung wie ich das Problem lösen kann?
Ich habe ein Raspberry pi 4 mit 4 gb ram. Daran solls nicht liegen ![]()
Grüße Chris
So, bin jetzt mittlerweile an meinen Windows Laptop gewechselt und mache von hier aus weiter.
Dabei habe ich die Bilder auf meine Fritz.Nas gelegt. Daher jetzt auch geänderte Strukturen. Auf meinem Windows Laptop läuft pycharm. PIL ist natürlich installiert.
Hier mein Code jetzt:
#!/usr/bin/env python3
from pathlib import Path
from PIL import Image
SOURCE_PATH = Path("\\fritz.box\\FRITZ.NAS\\Intenso-USB3-0Device-01\\Fotosinput")
TARGET_PATH = Path("\\fritz.box\\FRITZ.NAS\\Intenso-USB3-0Device-01\\Fotosoutput")
OVERLAY_FILE_PATH = Path ("\\fritz.box\\FRITZ.NAS\\Intenso-USB3-0Device-01\\Fotosinput\overlay.png")
def main():
with Image.open(OVERLAY_FILE_PATH) as overlay_image:
for image_file_path in SOURCE_PATH.glob("*.jpg"):
with Image.open(image_file_path, mode = "rgb") as image:
image.alpha_composite(overlay_image, mode = "rgba")
image.save(TARGET_PATH / image_file_path.name)
if __name__ == "__main__":
main()
Display More
Ein Ergebnis bekomm ich aber nicht wirklich.
Bis auf
C:\Users\Windows\PycharmProjects\Test\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1\plugins\python-ce\helpers\pydev\pydevconsole.py" --mode=client --port=53631
import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend(['C:\\Users\\Windows\\PycharmProjects\\Test', 'C:/Users/Windows/PycharmProjects/Test'])
PyDev console: starting.
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
runfile('C:/Users/Windows/Documents/batch1.py', wdir='C:/Users/Windows/Documents/')
kommt da nichts. Auch keine Bilder in
![]()
llutz Ich weiss nicht so recht, Zeichenkettenoperationen auf Dateipfaden — das ist klassischerweise eigentlich ein Fall für ``basename``:
Bashfor bild in ordner/*.jpeg; do gm composite overlay.png "$bild" output/"$(basename "$bild")"; doneChris1893 Falls es sich um viele Bilder handelt und es sich lohnt das auf mehrere Prozessoren/Kerne zu verteilen, ist GNU parallel ein einfacher Weg:
Und mit `PIL` ginge es so (ungetestet):
Python Display More#!/usr/bin/env python3 from pathlib import Path from PIL import Image SOURCE_PATH = Path("ordner") TARGET_PATH = Path("output") OVERLAY_FILE_PATH = Path("overlay.png") def main(): with Image.open(OVERLAY_FILE_PATH) as overlay_image: for image_file_path in SOURCE_PATH.glob("*.jpeg"): with Image.open(image_file_path) as image: image.alpha_composite(overlay_image) image.save(TARGET_PATH / image_file_path.name) if __name__ == "__main__": main()
Der python Ansatz sieht doch schon gut aus. Jetzt muss ich ihn nur noch dazu bringen rgb als farbmodus zu akzeptieren:
Versuche mal for bild in /ordner/*.jpeg ; do gm composite overlay.png /ordner/"$bild" /output/"$bild" ; done
Scheinbar bin ich zu doof. Mit dem Code komm ich leider nicht weiter.
Ich habe es nochmals mit GM über die Kommandozeile versucht. Jetzt bekomm ich folgende Meldung: gm composite: input images already specified (Dateipfad und -name)
Was mach ich falsch?
Gibt es noch eine Möglichkeit über PIL?