Wie skaliert man ein hochauflösendes Bild mit PHP?

8

Ich verarbeite Bilder, wenn der Benutzer ein Bild hochlädt, aber mein Problem ist hohe Bilder. Wie erkennen Sie, wenn der Benutzer einen hochlädt? Ich benutze die GD-Bibliothek für PHP. Wenn man die Qualität mit der imagejpeg () -Methode auf 90 setzt, macht man nichts, skaliert aber die Dimension und setzt dann den ppi auf 72. Ich möchte die Dimension beibehalten und den ppi gleichzeitig auf 72 setzen. Jeder Rat würde sehr geschätzt werden.

    
wavyGravy 21.01.2011, 01:35
quelle

6 Antworten

13

Soweit es Sie betrifft, gibt es keine PPI. Außerdem existiert DPI nicht digital. Es gibt nur Pixel und die Dimensionen (die nur ein Maß für Pixel in jeder Richtung sind).

Was Sie wirklich versuchen, ist ein Downsampling eines Bildes, wodurch die Gesamtabmessungen eines Bildes reduziert werden. Wahrscheinlich möchten Sie dies proportional tun, dh Sie möchten das Verhältnis von Breite zu Höhe beibehalten, damit das Bild nach dem erneuten Abtasten nicht gestreckt erscheint. Es ist auch erwähnenswert, dass Größenanpassung und Neuabtastung sich dadurch unterscheiden, dass bei der Größenanpassung dem Inhalt nicht viel Beachtung geschenkt wird, was zu sehr visuell schlechten Bildgrößen führt. Wahrscheinlich möchten Sie ein Resampling durchführen.

Die PHP-Dokumentation enthält einige großartige Beispiele zu Umgang mit hochgeladenen Dateien sowie wie die Größe von Bildern geändert wird mit der GDImage-Bibliothek. Ich schlage vor, Sie überprüfen sie. Andere relevante Methoden, über die Sie vielleicht etwas wissen möchten:

  • Mit getimagesize () können Sie die Größe eines Bildes überprüfen, ohne es zu öffnen es muss in der Größe geändert werden, ohne es zu laden).
  • imagesx () und imagesy () Grab-Dimensionen einer GD Image Ressource.
coreyward 21.01.2011, 01:45
quelle
12

PPI, DPI ...

Lassen Sie uns zuerst die Terminologie klären. Sowohl PPI (Pixel pro Zoll) als auch DPI (Punkt pro Zoll) sind Verhältnisse, die die Umwandlung von Pixeln in physikalische Einheiten (in diesem Fall Zoll) angeben. In der digitalen Welt - Computer, Bilder, ... DPI wird irrtümlicherweise dort verwendet, wo PPI verwendet werden sollte . DPI existiert tatsächlich nur in einer Druckwelt. Aber für uns jetzt, DPI = PPI . & gt; & gt; Weitere Informationen

Die Auflösungsinformationen (manchmal als DPI bezeichnet, aber es ist PPI) wird in den Headern (Bildmetainformationen) gespeichert. JPG und PNG unterstützen dies; aber GIF unterstützt DPI nicht - es ist nicht im GIF-Header .

Ändere PPI in PHP

Sie fragen sich wahrscheinlich, wie man PPI (DPI) im Bildkopf einstellt? In PHP können Sie es mit Imagick-Bibliothek tun (natürlich nicht für GIFs):

%Vor%

Wenn Sie diese Bilder herunterladen und versuchen, sie zu drucken, z. In IrfanView wird es tatsächlich die dpi-Informationen verwenden, um Pixel in physische Zieleinheit zu konvertieren. Beide Bilder werden in unterschiedlicher Größe gedruckt.

Image PPI funktioniert nicht im Web

Schlechte Neuigkeiten sind, dass dies nicht dazu führt, dass irgendetwas geändert wird, wenn das Bild auf einer Webseite angezeigt wird. Die Ankereinheit für die Anzeige ist immer ein Pixel in CSS. So haben img.jpg und img-500dpi.jpg genau die gleiche Größe im Browser. Selbst wenn Sie die Bilder direkt öffnen. Auch wenn Sie eine physikalische Einheit wie cm verwenden:

%Vor%

Beide Bilder werden in der gleichen Größe angezeigt; Die physikalischen Einheiten werden unabhängig von der Bildauflösung in Pixel konvertiert. Verwenden Sie dazu ein festes Verhältnis . Und selbst wenn Sie versuchen, die unformatierten Bilder (nicht die Seite) in Firefox zu drucken , werden sie beide in der gleichen Größe gedruckt. Kann andere Browser nicht kommentieren. Merkwürdig genug - das funktioniert wie erwartet in Irfanview.

PPI- und Retinabilder

Jetzt mit Iphones usw. Retina (d. h. hochauflösende) Bilder werden trendy. Hier wird viel über DPI gesprochen (PPI in der Tat), aber dies bezieht sich nur auf das Zielgerät und die CSS-Medienabfragen . Es gibt nichts, was den PPI Ihres Bildes tatsächlich erkennen würde; Sie müssen die tatsächlichen Abmessungen des hochauflösenden Retina-Bildes in Pixeln angeben. Dies ist ein Beispiel für das 66x66-Symbol ( von hier ):

%Vor%

Sie können die Bilder mit hoher Auflösung also "verkleinern", indem Sie für sie im CSS niedrigere Dimensionen festlegen . Aber ich würde nur empfehlen, dies für Retina-Bilder und innerhalb der richtigen Medienabfrage zu tun.

Sie müssen also in PHP

resampeln

Wenn Sie also das hochgeladene Bild "im Web" kleiner erscheinen lassen möchten, ist es am besten, es neu zu berechnen. Resampling bedeutet nicht nur den Header zu ändern, sondern die tatsächliche Pixelmatrix des Bildes zu ändern. Hier ist der Code, den ich in PHP verwende, der die GD-Bibliothek verwendet:

%Vor%

Beachten Sie, dass dies ziemlich viel Speicher erfordert, der möglicherweise von Ihrem Hosting-Provider eingeschränkt wird.

    
TMS 24.01.2014 23:56
quelle
1

Wenn Sie mit Hi-Res-Bildern arbeiten, gehe ich den ImageMagick-Pfad runter, da er schneller ist + gibt mehr Informationen über die Bilder + ermöglicht es Ihnen, Bilder mit 300 DPI (oder anderen Auflösungen) wiederzugeben wenn du willst.

Das mache ich mit Jcrop und ImageMagick (aber mit 72 DPI)

%Vor%     
niggles 21.01.2011 04:28
quelle
1

Mit phpthumb ( Ссылка ) ist eine gute, elegante und einfache Lösung.

Ich habe ein funktionierendes Codebeispiel, das es zu GitHub hochgeladen hat. Es kann sowohl GD & amp; Imagemagick, es liegt an dir.

Ссылка

    
sh4 21.01.2014 14:11
quelle
1

bool Imagick :: setResolution (float $ x_auflösung, float $ y_resolution)

    
user3865787 22.07.2014 17:53
quelle
0

Wenn Sie ppi reduzieren, ändern sich die Abmessungen entsprechend der Reduzierung - weniger Pixel pro Zoll bedeuten, dass Ihr Bild weniger Zoll hat.

    
blueberryfields 21.01.2011 01:45
quelle

Tags und Links