Guten Morgen,
hat jemand eine Idee, wie die maximale Auflösung eines (nicht-korrupten)
Bildes (Bildinhalt egal, irgendein gängiges Bildformat, kein
Vektor-Format wie SVG) sein kann, das eine maximale Dateigröße von 1MB
hat?
zB. Könnten Bildformate, die RLE verwenden (PCX, BMP) wahrscheinlich
recht gute Auflösung erreichen, ich weiß es aber nicht genau ...
Hat jemand eine Idee?
Grüße,
Mampf
Mampf schrieb:> hat jemand eine Idee, wie die maximale Auflösung eines (nicht-korrupten)> Bildes (Bildinhalt egal, irgendein gängiges Bildformat, kein> Vektor-Format wie SVG) sein kann, das eine maximale Dateigröße von 1MB> hat?
wird wohl auf unentlich rauslaufen. TIFF mit Fax4 verwendet RLE. Wenn
das bild komplett weiss oder schwarz ist ist die Auflösung nur durch die
Datentypen in er Datei begrenzt.
Kommt aufs Format drauf an.
Unkomprimiert bekommst du die Pixelanzahl über
(Dateigröße-Overhead) / Farbtiefe
Bei komprimierten Formaten (z.B. JPG) kommt es ganz auf die
Komprimierungsstufe an.
Stawito schrieb:> Ein leeres Gif Bild 65536x65536 Pixel kann man unter 0.1kB anlegen.
Ist es aber dann auch gültig?
Der Huffmann-Decoder wird ja merken, wenn Bilddaten fehlen ... selbst,
wenn der Encoder jedes Pixel mit 1Bit kodiert wird, wird die Datenmenge
>0,1kB sein ... Ich weiß spontan garnicht, ob GIF Lauflängenkodierung
kann ...
Mampf schrieb:> Ist es aber dann auch gültig?>> Der Huffmann-Decoder wird ja merken, wenn Bilddaten fehlen ... selbst,
Also Bilder werden in der Regel nicht mit Huffmann kodiert. Da wird in
der Regel was mit "Lauflängen" gemacht. GIF benutzt ganz konkret LZW,
welches wiederkehrende Pixelfolgen in einzelne Symbole übersetzt.
Somit kommst Du auch bei Bildern weit unter einem Bit pro Pixel wenn Du
einfarbige Bilder hast. Bei 16 Farben RLE BMPs bekommst Du bei Farbe x
pro 16 Pixel ein Byte. Macht ein halbes Bit pro Pixel. Bei 256 Farben
RLE kannst Du sogar 256 gleichfarbige Pixel pro 2 Bytes übertragen. Das
macht 1/16tel Bit pro Pixel.
Schonmal danke für eure Antworten ...
Der Grund wieso ich frage ... Ich arbeite an einer Web-Plattform, die
den Upload von Bildern ermöglicht.
Im Backend arbeitet Java, das per HTTPServlet das Bild empfängt.
Meine Sorge ist, dass man das Exploiten kann ... 1MB Bild, aber
Dimensionen zB 64k*64k. Wenn Java versuchen würde, ein solches Bild zB
zu verkleinern, müsste es dieses ja erstmal dekomprimieren.
Ich frag mich, ob man so eine komplette VM (inkl Tomcat) abschießen
könnte ...
Nun, du kannst ja auch erstmal in den Header reingucken, wie groß es
denn sein wird. Die Upload-Größe ist ja ohnehin beschränkt. Entweder
steht nun im Header was Brauchbares drin, also eine realistische Größe.
Dann kannst du ruhig dekomprimieren und so weiter.
Oder da steht schon Unfug drin, dann hat sich das Thema doch erledigt.
Stawito schrieb:> Ein leeres Gif Bild 65536x65536 Pixel kann man unter 0.1kB anlegen.
Und wie wäre die Dateigrösse, wenn man in der Mitte des 65536x65536
Bildes einen einzelnen schwarzen Punkt hätte?
Gruss
Harald
Mampf schrieb:> Ich frag mich, ob man so eine komplette VM (inkl Tomcat) abschießen> könnte ...
Ich denke mal, wenn Du so was verwendest, dann sind die bis zu 12
Gigabyte die solch ein Bild maximal an Speicher brauchen könnte, auch
egal. :)
Mampf schrieb:> Meine Sorge ist, dass man das Exploiten kann ... 1MB Bild, aber> Dimensionen zB 64k*64k. Wenn Java versuchen würde, ein solches Bild zB> zu verkleinern, müsste es dieses ja erstmal dekomprimieren.
Erstmal wird Java versuchen entsprechend Speicher zu reservieren, dies
wird fehlschlagen und der Betrieb geht bei passender Fehlerbehandlung
ganz normal weiter...
Die JPEG-Lib (referenzimpl) hat IIRC ne API-Funktion, um ein JPEG gleich
von Anfang an in einer niedrigeren Auflösung zu dekomprimieren, damit
kriegt man die Megapixel-Monster auch ohne Gigabytes an Ram gelesen.
Wenn das nicht reicht, oder schlechte Qualität liefert: JPEG kann auch
Zeilenweise (Zeilenblockweise) dekomprimieren, dann reichen dir z.B. 32
Zeilen des Bildes auf einmal im Ram, und du kannst troztdem bikubisch
interpolieren.