Re: Image Datei lesen
Verfasst: Montag 26. Juni 2017, 23:44
@tjost: Inhaltlich helfen ist genau genommen nicht die Aufgabe eines Moderators. Das kann er machen, muss er aber nicht. Ich habe auch geholfen, nur das meine Hilfe nicht angenommen wurde.
Um das „Sky Cinema“ herunter zu skalieren und in eine Bitmap umzuwandeln ist `PIL` nicht wirklich gut geeignet. Insbesondere der letzte Schritt haut qualitativ nicht wirklich hin, denn `PIL` kennt zum dithern nur den Floyd-Steinberg-Algorithmus oder einen einfachen Schwellenwert.
Floyd-Steinberg:

Schwellenwert:

Ein bisschen besser bekommt man es zum Beispiel mit ImageMagick's ``convert`` und einem „ordered dither“ hin, aber bei der Grösse müsste man für gute Bilder wahrscheinlich manuell Pixeln.
``convert`` mit „2×2 ordered dither“:

Wenn die Bilder nicht live von irgendwo her geholt werden, kann man die ja auch *einmal* mit einem geeigneten Werkzeug umwandeln und im Dateisystem hinterlegen.
Deine Lösung beschäftigt jetzt einen Prozessorkern zu 100% damit ständig ein Bild zu laden, zu verkleinern, in eine Bitmap umzuwandeln, und dann an das Display zu senden. Und der überwiegenden Zahl der Fälle ist das immer das gleiche Bild. Ich nehme mal an das Du keinen Raspi mit *einem* Prozessorkern hast, sonst wäre das wahrscheinlich schon unangenehm aufgefallen.
@Melewo: Ich vermute mal ganz stark die Dateinamen sind genau so gewählt wie sie als Bytes aus den DVB-Daten kommen ohne das man herausfinden müsste wie sie kodiert sind, damit sie direkt verwendet werden können. Unter Linux zumindest. Aber da das auf dem Raspi läuft, wäre das ja kein Problem. Notfalls könnte man die paar Namen die nicht UTF-8 kodiert sind, auch einfach umbenennen. Das nachfolgende Java-Programm sagt es sind 1,22 Prozent. Ob man das jetzt als viel oder wenig ansieht… Man kann die auf jeden Fall dann auch automatisiert umbenennen (leider nicht mit Java).
[codebox=java5 file=Unbenannt.java]import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public final class Main {
private Main() {}
public static void main(String... args) throws IOException {
final Path logosPath = Paths.get(
System.getProperty("user.home"), "src/Senderlogos");
final Collection<String> fileNames;
try (Stream<Path> pathStream = Files.list(logosPath)) {
fileNames = pathStream
.map(path -> path.getFileName().toString())
.sorted()
.collect(Collectors.toList());
}
final long notDecodableCount = fileNames.stream()
.filter(name -> name.contains("�"))
.peek(System.out::println)
.count();
System.out.printf(
"%d = %.2f%% der Dateinamen konnten nicht dekodiert werden.\n",
notDecodableCount,
100.0 * notDecodableCount / fileNames.size());
}
}[/code]
Um das „Sky Cinema“ herunter zu skalieren und in eine Bitmap umzuwandeln ist `PIL` nicht wirklich gut geeignet. Insbesondere der letzte Schritt haut qualitativ nicht wirklich hin, denn `PIL` kennt zum dithern nur den Floyd-Steinberg-Algorithmus oder einen einfachen Schwellenwert.
Floyd-Steinberg:

Schwellenwert:

Ein bisschen besser bekommt man es zum Beispiel mit ImageMagick's ``convert`` und einem „ordered dither“ hin, aber bei der Grösse müsste man für gute Bilder wahrscheinlich manuell Pixeln.
``convert`` mit „2×2 ordered dither“:

Wenn die Bilder nicht live von irgendwo her geholt werden, kann man die ja auch *einmal* mit einem geeigneten Werkzeug umwandeln und im Dateisystem hinterlegen.
Deine Lösung beschäftigt jetzt einen Prozessorkern zu 100% damit ständig ein Bild zu laden, zu verkleinern, in eine Bitmap umzuwandeln, und dann an das Display zu senden. Und der überwiegenden Zahl der Fälle ist das immer das gleiche Bild. Ich nehme mal an das Du keinen Raspi mit *einem* Prozessorkern hast, sonst wäre das wahrscheinlich schon unangenehm aufgefallen.

@Melewo: Ich vermute mal ganz stark die Dateinamen sind genau so gewählt wie sie als Bytes aus den DVB-Daten kommen ohne das man herausfinden müsste wie sie kodiert sind, damit sie direkt verwendet werden können. Unter Linux zumindest. Aber da das auf dem Raspi läuft, wäre das ja kein Problem. Notfalls könnte man die paar Namen die nicht UTF-8 kodiert sind, auch einfach umbenennen. Das nachfolgende Java-Programm sagt es sind 1,22 Prozent. Ob man das jetzt als viel oder wenig ansieht… Man kann die auf jeden Fall dann auch automatisiert umbenennen (leider nicht mit Java).
[codebox=java5 file=Unbenannt.java]import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public final class Main {
private Main() {}
public static void main(String... args) throws IOException {
final Path logosPath = Paths.get(
System.getProperty("user.home"), "src/Senderlogos");
final Collection<String> fileNames;
try (Stream<Path> pathStream = Files.list(logosPath)) {
fileNames = pathStream
.map(path -> path.getFileName().toString())
.sorted()
.collect(Collectors.toList());
}
final long notDecodableCount = fileNames.stream()
.filter(name -> name.contains("�"))
.peek(System.out::println)
.count();
System.out.printf(
"%d = %.2f%% der Dateinamen konnten nicht dekodiert werden.\n",
notDecodableCount,
100.0 * notDecodableCount / fileNames.size());
}
}[/code]