Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] imagewebp() - jak wysłać obrazek w odpowiedzi ajaxa
siutek
post 3.11.2020, 22:13:48
Post #1





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Cześć, mam zagwozdkę...

Mam na serwerze różne rodzaje plików graficznych: niektóre JPG inne TIFF.

Z formularza na stronie wysyłam ajaxa z danymi do umieszczenia na tych grafikach. Chciałbym te grafiki przerobione uzyskać w odpowiedzi ajaxa, tak bym mógł go wstawić w tag <img src=''> o konkretnym ID.
Wymyśliłem sobie, że aby maksymalnie "odciążyć" łącze użytkownika, będę wysyłał grafiki wynikowe w formacie webp. No i teraz pojawia się pytanie:

- jak przypisać wynik działania funkcji imagewebp() do zmiennej? Tak bym mógł właśnie ten obraz wysłać ajaxem do przeglądarki?
Go to the top of the page
+Quote Post
SmokAnalog
post 4.11.2020, 11:10:45
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Jeśli ten obrazek ma być użyty tylko raz, to może po prostu zwróć Ajaxem zasób obrazka? Wtedy wystarczy:

  1. header('Content-Type: image/webp');
  2.  
  3. // tutaj tworzysz swój obrazek
  4.  
  5. imagewebp($image);


Ustawianie Content-Type nie jest niezbędne w Twoim przypadku (zadziała bez tego), ale jednak wypada podać smile.gif

Potem na tej podstawie konwertujesz do base64 i przypisujesz src="data:image/webp;base64,TwójBase64"

EDIT

Z ciekawości sprawdziłem czy działa łatwo z Fetch API i na szczęście tak smile.gif Zobacz ten przykład:

1. Masz jakiś obrazek w pliku obrazek.jpg. Ten obrazek będziemy przekształcać i zapisywać jako webp.

2. Plik obrazek.php, gdzie przekształcasz obrazek i go "wypluwasz":
  1. <?php
  2.  
  3. header('Content-Type: image/webp');
  4.  
  5. $image = imagecreatefromjpeg('obrazek.jpg');
  6.  
  7. // tutaj możesz się bawić obrazkiem
  8.  
  9. imagewebp($image);


3. I przykładowy HTML, gdzie to się dzieje:
  1. <button>Czary mary</button>
  2. <img>
  3. document.querySelector('button').addEventListener('click', async () => {
  4. const response = await fetch('obrazek.php');
  5. const resource = await response.blob();
  6.  
  7. document.images[0].src = URL.createObjectURL(resource);
  8. });


Działa pięknie smile.gif

Dla kompletności mojej odpowiedzi jeszcze dodam, że oczywiście możesz ustawić src obrazka bezpośrednio na plik .php:

  1. <img src="obrazek.php">


Jeżeli plik PHP wypluwa obrazek tak jak nasz obrazek.php, to <img> sobie poradzi - nawet bez Content-Type lub z nieprawidłowym Content-Type.

Jeżeli musisz wysłać do tego pliku dużo danych lub np. wysyłasz mu obrazek źródłowy, to Fetch API lub Ajax będą na miejscu. Ale jeśli chodzi o prostą operację np. pokazania TIFF jako webp, ustawienie src na plik PHP może wystarczyć. Zakładając, że te obrazki TIFF są na serwerze i tylko mówisz skryptowi który obrazek ma wyświetlić jako webp, możesz np. podawać ten obrazek źródłowy jako parametr w zwykłym GET:

[JAVASCRIPT] pobierz, plaintext
  1. const sourceFileName = document.getElementById('my-input').value;
  2.  
  3. document.getElementById('my-image').src = 'http://foo.test/obrazek.php?source=' + encodeURIComponent(sourceFileName);
[JAVASCRIPT] pobierz, plaintext


I to wystarczy.

Ten post edytował SmokAnalog 3.11.2020, 22:50:56
Go to the top of the page
+Quote Post
siutek
post 4.11.2020, 13:01:12
Post #3





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Dzięki.
generalnie ciągle myślę jak najlepiej sensownie ograć całość.

główne założenie są takie, że ajaxem wysyłam dane z formularza, według tych danych modyfikuję źródłowy plik tiff/jpg i... wypluwam go do wyświetlenia ajaxem ORAZ zapisuję jako miniaturkę do podglądu na serwerze.

wczoraj chciałem jeszcze wysyłać ten obraz ajaxem, ale chyba faktycznie lepiej będzie zapisać miniaturkę, a jej nazwę (zakodowaną base64) wyślę w odpowiedzi ajaxa. Ten string umieszczę w <img src=> razem z adresem pliku php, który odczyta obrazek z serwera. Czyli <img src="https://mojserwer.pl/obrazek.php?hjs74hdlaldurbvxc6skskxjx">

zależy mi również na ukryciu prawdziwej lokalizacji tych grafik na serwerze, stąd plik php, który ma wyświetlać zawartość grafiki.
Go to the top of the page
+Quote Post
SmokAnalog
post 4.11.2020, 22:32:02
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Tak naprawdę to czy zrobisz to zwracając obrazek w odpowiedzi, czy tylko jego URL, to będzie git majonez. Nie wiem co tam robisz z tym obrazkiem, ale czasami nawet nie trzeba pokazywać użytkownikowi właściwego obrazka, tylko jego "symulację". Na przykład jeśli tylko wycinasz fragment z tego obrazka lub nakładasz jakieś proste efekty, czasem można to zrobić po stronie klienta. Jeśli chodzi o tworzenie obrazka na podstawie przesłanego obrazka z <input type="file"> to pamiętaj, że możesz ten obrazek wyświetlić natychmiast, zanim wyślesz cokolwiek na serwer. To jest bardzo miły dla oka efekt.

Ale ogólnie mam za mało informacji, żeby coś konkretnego doradzić, bo nie wiem co konkretnie chcesz zrobić smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 07:07