Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][AJAX][PHP]Zmiana DPI - zmiana źródła
Forum PHP.pl > Forum > Przedszkole
Stron: 1, 2
rafik73
Witam
Za pomocą biblioteki dom-to-image tworzę obrazek z DIV'a:

[JAVASCRIPT] pobierz, plaintext
  1. var pdf = $('#pdf_area > .ol-viewport')[0];
  2. domtoimage.toJpeg(pdf,
  3. {
  4. quality : 1
  5. }
  6. )
  7. .then(function (dataUrl) {
  8. $.ajax({
  9. url : "dec.php",
  10. data : {
  11. ajax_dataUrl : dataUrl
  12. }
  13. ,
  14. context: this,
  15. success : function(callback) {
  16. } , //success
  17.  
  18. }); //ajax
[JAVASCRIPT] pobierz, plaintext


Stosując typeof wyszło mi, że dataUrl to string. Wysyłam go do pliku dec.php który wygląda tak:

  1. $ajax_dataUrl = isset($_POST['ajax_dataUrl']) ? $_POST['ajax_dataUrl'] : '';
  2.  
  3. $src = '1.jpg';
  4. $img = imagecreatefromjpeg($src);
  5. $new_x = 828;
  6. $new_y = 536;
  7. //$new_x = 424;
  8. //$new_y = 268;
  9. $img_new = imagecreatetruecolor($new_x, $new_y);
  10.  
  11. imagecopyresampled($img_new, $img, '0', '0', '0', '0', $new_x, $new_y, imagesx($img), imagesy($img));
  12. imagejpeg($img_new, $src, 100);
  13. imagedestroy($img);
  14.  
  15. // Change DPI
  16. $dpi_x = 144;
  17. $dpi_y = 144;
  18.  
  19. // Read the file
  20. $size = filesize($src);
  21. $img_new = file_get_contents($src);
  22.  
  23. // Update DPI information in the JPG header
  24. $img_new[13] = chr(1);
  25. $img_new[14] = chr(floor($dpi_x / 255));
  26. $img_new[15] = chr( $dpi_x % 255);
  27. $img_new[16] = chr(floor($dpi_y / 255));
  28. $img_new[17] = chr( $dpi_y % 255);
  29.  
  30. // Write the new JPG
  31. $f = fopen('thumb_'.$src, 'w');
  32. fwrite($f, $img_new, $size);
  33. fclose($f);


Skrypt ten ma za zadanie zmianę DPI pliku 1.jpg a chciałbym, żeby to robił w odniesieniu do
obrazka który wysyłam zmienną $ajax_dataUrl. Nie za bardzo wiem jak zmienić powyższy skrypt PHP.
nospor
Noto zamiast imagecreatefromjpeg uzyj
https://www.php.net/manual/en/function.imag...efromstring.php

ps:

Cytat
Stosując typeof wyszło mi, że dataUrl to string.

Do sprawdzania zawartosci nie uzywa sie typeof. Co z tego ze wiesz ze to tekst, skoro tam moze byc zupelnie inny tekst niz sie spodziewales.
Uzywaj
console.log()
by miec pewnosc co zawiera zmienna
rafik73
To próbowałem ale nie działa

dałem
[JAVASCRIPT] pobierz, plaintext
  1. alert(dataUrl);
[JAVASCRIPT] pobierz, plaintext

i wyszło:

  1. data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQH/wAARCAKeBAsDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKF
    hcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJ
    WWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkN
    OEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkp
    OUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+2Cvxc6AoAKAFAyQB1Jxz71dODqThTjbmnKMFfRXk0lf5sFq0u5qCNAgQgEAY56/X6n2r7uODw6w8MNKnGpThFJc0Ve/Wae8ZSd22ne73N7K1raf1/VxURUG1RgdavDYalhafsqMbRu5Nt3lJvrJ6XsrJeS+YJJbf8E89+JvhfW/Fnh4aXol9FaSm6jluYZ2aOG9t1DAwyTIGZAjlZQuxlkK7WA4NfS8PZlg8sxzxGMoyqx9nKNOcEpTozun
    zKLaTuly3umr3PluLsnzHOssWEy7EQoy9tCdalUk4U8RSV/clUipSjyytPls4ztZ9DH+GPwybwMLu+vb8Xmq38K28qWvmLY28CusoRBIFe4lMigmd449i5SNAGdn6+IuIlnPs6FGg6WGozdSMqnK605tOPM+W6hHldlBSld6yeyjxcI8Ivh322JxGJVfGYmmqU4UeZYelTUoz5VzWlVnzJfvJRgoq8YxV5Sl65Xyx9uF
    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
    BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ
nospor
Super, a skad my mamy wiedziec jak probowales? Pewnie probowales zle. Pokaz jak probowales...
rafik73
patrz wyżej
nospor
Wyzej NADAL nie napisales jak probowales....
rafik73
zamieniłem:

  1. $src = $ajax_dataUrl;
  2. $img = imagecreatefromjpeg($src);

na

  1. $src = $ajax_dataUrl;
  2. $img = imagecreatefromstring($src);
nospor
W linku do ktorego ciebie odeslalem, masz JEDEN przyklad uzycia. Byloby milo, jakbys raczyl PRZEANALIZOWAC ten przyklad ktory tam podali gdyz zawarte tam sa bardzo wazne informacje na temat tego jak uzywac tej funkcji w przypadku danych, ktore wlasnie ty masz. Jedyne co musisz zrobic to delikatnie go dopasowac do swojego przypadku

Poza tym, rowniez dalej w swoim kodzie

$size = filesize($src);
$img_new = file_get_contents($src);

masz kod, ktory zaklada, ze $src to sciezka pliku. To tez masz poprawic
rafik73
Na początek dałem tak:

  1. $src = $ajax_dataUrl;
  2. $src = base64_decode($src);
  3. $img = imagecreatefromstring($src);
nospor
Zauwaz, ze twoj tekst nie sklada sie z samego base64. Na poczatku ma pare znakow, ktore masz usunac wpierw...
rafik73
Masz na myśli nagłówek?
nospor
data:image/jpeg;base64,
rafik73
dałem:

  1. $del_string = 'data:image/jpeg;base64,';
  2. $src = str_replace($del_string, "", $string);
  3.  
  4.  
  5. $src = base64_decode($src);
  6. $img = imagecreatefromstring($src);


wyskakuje błąd:

Notice: imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Premature end of JPEG file in
nospor
1) Uzywasz jakiejs zmiennej $string ktorej dotad jeszcze nie widzialem.
2) $src = base64_decode($src);
Zapisz sobie zmienna $src po odkodowaniu jako plik jpg i sprawdz co zawiera i czy mozesz w ogole go otworzyc normalnie
rafik73
$string to przesyłany ciąg znaków zawarty w dataUrl . Tak jest mi łatwiej testować pomijając Ajax

$str zawiera (wyświetlam skróconą wersję):

  1. ����JFIF��C��C��� �� ���}!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���������������������������������������������������������������������������


a obrazek jest czarny i tylko na samej górze widać fragment zniekształconej grafiki
nospor
Wiec pewnie cos zle tego base64 skopiowales. Jak skopiowales go z tego co pokazywal ci alert to moglo sie pokaszanic. Lepiej zapisz z tego co otzymujesz po wyslaniu ajaxem
trueblue
A to: "& #65533;" skąd się wzięło?
rafik73
po odpaleniu Ajaxa i wygenerowaniu pliku obrazek jest ok

ale pozostaje nieszczęsne:

  1. $size = filesize($src);
  2. $img_new = file_get_contents($src);
nospor
Kurcze, no ale wez troche samodzielnosci tu walnij. Wszystko mamy ci podac jak na tacy? nawet tak banalne rzeczy?
Zajrzyj do manuala, zobacz co robi filesize() i pomysl przez chwile sam jak to zastapic w odniesieniu do tekstu... To samo z file_get_contents.
rafik73
strlen()
nospor
Brawo
rafik73
Myślę, że doszedłem do ładu:

  1. $ajax_dataUrl = isset($_POST['ajax_dataUrl']) ? $_POST['ajax_dataUrl'] : '';
  2.  
  3.  
  4.  
  5. $del_string = 'data:image/jpeg;base64,';
  6. $src = str_replace($del_string, "", $ajax_dataUrl);
  7.  
  8.  
  9. $src = base64_decode($src);
  10.  
  11. //$img = imagecreatefromstring($src);
  12.  
  13. $img = $src;
  14. $new_x = 828;
  15. $new_y = 536;
  16. //$new_x = 424;
  17. //$new_y = 268;
  18. $img_new = imagecreatetruecolor($new_x, $new_y);
  19.  
  20. imagecopyresampled($img_new, $img, '0', '0', '0', '0', $new_x, $new_y, imagesx($img), imagesy($img));
  21. imagejpeg($img_new, $src, 100);
  22. imagedestroy($img);
  23.  
  24. // Change DPI
  25. $dpi_x = 144;
  26. $dpi_y = 144;
  27.  
  28. // Read the file
  29. $size = strlen($src);
  30. $img_new = $src;
  31.  
  32. // Update DPI information in the JPG header
  33. $img_new[13] = chr(1);
  34. $img_new[14] = chr(floor($dpi_x / 255));
  35. $img_new[15] = chr( $dpi_x % 255);
  36. $img_new[16] = chr(floor($dpi_y / 255));
  37. $img_new[17] = chr( $dpi_y % 255);
  38.  
  39. // Write the new JPG
  40. $f = fopen('test.jpg', 'w');
  41. fwrite($f, $img_new, $size);
  42. fclose($f);


file_get_content czyta zawartość do stringa, a ja takową zawartość już posiadam w $src po obcięciu nagłówka.
nospor
Cytat
file_get_content czyta zawartość do stringa, a ja takową zawartość już posiadam w $src po obcięciu nagłówka.


Dokladnie tak. Jak widzisz trudne to nie bylo smile.gif
rafik73
Dziękuję za pomoc. Ech, jak się człowiek zasiedzi nad projektem to zamulenie kieruje człowieka na ścieżkę łatwizny a to nie tędy droga. Czas na mały reset zasobów. Pozdrawiam i dziękuję.

Ostatnia prośba. Jest już późno i mam dosyć. Próbuję pobrać ten obrazek w ten sposób:

  1. header("Content-Type: image/jpeg");
  2. header('Content-Disposition: attachment; filename="ff.jpg"');
  3.  
  4. echo $img_new;


i nie działa.

Zależy mi na opcji SAVE AS.

Aha, działa:

  1. $f = fopen('test.jpg', 'w');
  2. fwrite($f, $img_new , $size);
  3. fclose($f);



OK, już sobie poradziłem. Problem był w tym, że skrypt PHP działał wywołany Ajaxem. Zwróciłem obrobiony obrazek callback'iem
i wyświetliłem w JS:

PHP:

  1. $ajax_dataUrl = isset($_POST['ajax_dataUrl']) ? $_POST['ajax_dataUrl'] : '';
  2. $ajax_pdf_zoom_number = isset($_POST['ajax_pdf_zoom_number']) ? $_POST['ajax_pdf_zoom_number'] : '';
  3.  
  4.  
  5. $path = $ajax_dataUrl;
  6.  
  7. $del_string = 'data:image/jpeg;base64,';
  8. $path = str_replace($del_string, "", $path);
  9. $path = base64_decode($path);
  10. $image = substr_replace($path, pack("cnn", 1, 180, 180), 13, 5);
  11.  
  12. $enc = base64_encode($image);
  13. $callback = $del_string.$enc;
  14. /*
  15. $f = fopen('Zoom_numer'.$ajax_pdf_zoom_number.'.jpg', 'w');
  16. fwrite($f, $image);
  17. fclose($f);
  18. */
  19. echo $callback;


JS:

[JAVASCRIPT] pobierz, plaintext
  1. var pdf = $('#pdf_area > .ol-viewport')[0];
  2.  
  3. domtoimage.toJpeg(pdf,
  4. {
  5. quality : 1
  6. }
  7. )
  8. .then(function (dataUrl) {
  9.  
  10. // alert(dataUrl);
  11. //########################################################
  12.  
  13. $.ajax({ // ajax
  14. type : "POST",
  15. url : "dec2.php",
  16. data : {
  17. ajax_dataUrl : dataUrl,
  18. ajax_pdf_zoom_number : pdf_zoom_number
  19. }
  20. ,
  21. context: this,
  22.  
  23. success : function(callback) {
  24.  
  25. var link = document.createElement('a');
  26. link.download = 'Zoom_numer_' + pdf_zoom_number +'.jpg';
  27. link.href = callback;
  28. link.click();
  29.  
  30. } //success
  31.  
  32. }); //ajax
[JAVASCRIPT] pobierz, plaintext


A jak aktywować pobieranie tego pliku bez callbacku Ajaxa?
nospor
A zes sie tego callback uczepil... Tu nie masz zadnego callback tylko zwykly response. I co ci on przeszkadza?

A jak chcesz normalnie to normalnie masz slac forma a potem naglowkami leciec jak miales oryginalnie
rafik73
Myślę, że response (callback) wysyła plik od klienta na serwer co wydłuża proces oczekiwania na pobieranie.
Próbuję tak, ale nie chodzi:

  1. header("Content-type: image/jpeg");
  2. header('Content-Disposition: attachment; filename="'.basename("eee.jpg").'"');
  3.  
  4. echo $image;
nospor
Kurcze...
nawet jak uzyjesz slowo callback w nawiasie, to nadal jest w BLEDZIE. Przestan uzywac slowo callback w tym kontekscie bo to jest zle.

Rowniez response to nie idzie z przegladarki na serwer tylko z serwera do przegladarki. REQUEST idzie z przegladarki na serwer. Zapoznaj sie z tymi podstawomi pojeciami i przestan w koncu ich uzywac bez skladu i ladu.

I nie, mowilem ci ze headers masz dawac w normalnym wyslaniu forma a nie w ajax
rafik73
Ok,
1) wysyłam plik do obróbki za pomocą AJAX do skryptu PHP który modyfikuje jego DPI.
2) chcę, żeby zmodyfikowany obrazek był automatycznie pobrany bez powrotu do JS
3) co masz na myśli pisząc "wysłać formą"?
nospor
No masz to wyslac jako normalny formularz. O
<form>
.....
</form>
slyszal?

Jednak nawet jesli wyslesz to jako normalny form, to nadal te bajty obrazka bedziesz slal na serwer wiec za bardzo nie wiem jaki z tego zysk bedziesz mial. Generalnie, jak chccesz by serwer ci przetworzył ten obrazek to tak czy siak na ten serwer musisz go wyslac niewazne jak. Wiec argument o wolnym wysylaniu na serwer jakos nie pasuje.
trueblue
Jeśli wysłałeś w response zakodowany w base64 obrazek, to kiedy wywołujesz kliknięcie na linku, to obrazek nie jest pobierany ponownie z serwera, tylko bezpośrednio z przeglądarki.
Nawet gdyby Ci się udało wywołać pobierane bezpośrednio w PHP, to nic na tym nie zaoszczędzisz.
rafik73
Cytat(nospor @ 3.01.2020, 14:37:20 ) *
No masz to wyslac jako normalny formularz. O
<form>
.....
</form>
slyszal?

Jednak nawet jesli wyslesz to jako normalny form, to nadal te bajty obrazka bedziesz slal na serwer wiec za bardzo nie wiem jaki z tego zysk bedziesz mial. Generalnie, jak chccesz by serwer ci przetworzył ten obrazek to tak czy siak na ten serwer musisz go wyslac niewazne jak. Wiec argument o wolnym wysylaniu na serwer jakos nie pasuje.


Słyszał. Myślałem, że chodzi ci o formularz zamiast ajaxa, a nie o wysłanie obrazka formularzem.




Cytat(trueblue @ 3.01.2020, 14:44:30 ) *
Jeśli wysłałeś w response zakodowany w base64 obrazek, to kiedy wywołujesz kliknięcie na linku, to obrazek nie jest pobierany ponownie z serwera, tylko bezpośrednio z przeglądarki.
Nawet gdyby Ci się udało wywołać pobierane bezpośrednio w PHP, to nic na tym nie zaoszczędzisz.


Skoro tak to odpuszczam dziwaczenie. Tylko jak na niecały 1MB obrazka to trochę muli ta cała operacja.
trueblue
Cytat(rafik73 @ 3.01.2020, 15:07:10 ) *
Skoro tak to odpuszczam dziwaczenie. Tylko jak na niecały 1MB obrazka to trochę muli ta cała operacja.

A jeśli nie wstawiasz do linku zawartości response, to również trwa długo (zamiast kliknięcia wstaw alert)?
rafik73
Tak.

na localhoscie trwa to błyskawicznie
nospor
Nom, czyli dlugi czas to efekt wysylania na serwer i obrobki przez serwer
rafik73
Cytat(nospor @ 3.01.2020, 15:23:33 ) *
Nom, czyli dlugi czas to efekt wysylania na serwer i obrobki przez serwer

No to tego się nie przeskoczy, chyba, że mi światłowód podciągną closedeyes.gif

1MBit wysyłania na VDSL i wszystko jasne (jeśli oczywiście osiągnie maksa). Muszę zrobić test i udostępnić net z LTE, tam wysyłanie szybsze. ph34r.gif
nospor
1MB to 1 MegaByte a nie jeden MegaBit - to tak w kwestii rzeczy, ktore znowu mylisz wink.gif
rafik73
Napisałem 1 MBit a nie 1 MB, czepiasz się o literówkę (duże b zamiast małego)
https://pl.wikipedia.org/wiki/Megabit
Czasem wyluzuj chłopie bo mi się to zaczyna kojarzyć z Adasiem Miauczyńskim z "Dnia Świra" - wszystko poprawiał (nerwica natręctw).
Życie to nie bity- 1 lub 0, ale kubity
https://pl.wikipedia.org/wiki/Kubit
Pozdrawiam i dziękuję specool.gif biggrin.gif
nospor
No wlasnie nie. W poscie nr 31 napisales 1MB a pare postow pozniej napisales 1MBit. Ewidetnie wynika, ze dla ciebie to jedno i to samo.
A najlepsze jest to, ze jak ciebie poprawiam, to mi wysylasz linka do wikipedii ze niby ty masz racje, a tam wyraznie rozroznione jest MB od Mb/Mbit (b z malej litery) co tylko udowadnia ze ty sie myliles

I bym ciebie nie poprawial o te nieszczesnie bity gdybys wczesniej nie popelnial tylu innych bledow. Operujesz na pojeciach, ktorych nie rozumiesz i tylko wprowadzasz innych i siebie w blad. No ale jak wolisz tak zyc, twoja sprawa smile.gif
rafik73
W poście 31 odniosłem się do wielkości obrazka w megabajtach a w poście 35 do prędkości wysyłania łącza w megabitach. Co do reszty masz absolutną racje - totalnie to pokiełbasiłem na zasadzie "gdzieś dzwoni ale nie wiem gdzie", ale do końca nie jest tak,że kompletnie nie znam tych pojęć - taki los niedzielnego "programisty" - więc proszę o wyrozumiałość.
nospor
A widzisz, zle zrozumialem
Cytat
1MBit wysyłania na VDSL
Sadzilem ze wysylasz 1MB danych a nie dane z predkoscia 1Mbit - b z malej wink.gif
A Dzien Swira uwielbiam - tak to o mnie biggrin.gif
rafik73
Tak sobie pomyślałem, że jakby zmienić DPI za pomocą JavaScript to wszystko działoby się po stronie przeglądarki i szybkość by bardzo wzrosła. Tylko jak przerobić ten skrypt PHP na JS?
trueblue
A skąd wiesz czy wolne działanie skryptu nie jest spowodowane skryptem JS do robienia "zrzutów ekranowych"?
Być może problem leży w samym przetwarzaniu elementów HTML na Canvas, albo kompresją obrazu do JPEG.

Swoją drogą pogarszasz jakość dwukrotnie. Raz kiedy właśnie z HTML jest tworzony JPEG, a potem kiedy ten JPEG staje się źródłem dla celów skalowania i tworzysz ponownie JPEG. Może lepiej i szybciej byłoby tworzyć PNG, a potem JPEG.

Warto też zajrzeć do dokumentacji domtoimage. Są tam parametry width oraz height, być może już w tym momencie będziesz mógł zmienić skalę, bez potrzeby zaprzęgania PHP.
nospor
Cytat
A skąd wiesz czy wolne działanie skryptu nie jest spowodowane skryptem JS do robienia "zrzutów ekranowych"?
Napisal wczesniej, ze na localhost dziala jak ta lala, wiec problem przegladarki mozna raczej wykluczyc wink.gif
rafik73
Cytat(trueblue @ 3.01.2020, 17:19:41 ) *
A skąd wiesz czy wolne działanie skryptu nie jest spowodowane skryptem JS do robienia "zrzutów ekranowych"?
Być może problem leży w samym przetwarzaniu elementów HTML na Canvas, albo kompresją obrazu do JPEG.

Swoją drogą pogarszasz jakość dwukrotnie. Raz kiedy właśnie z HTML jest tworzony JPEG, a potem kiedy ten JPEG staje się źródłem dla celów skalowania i tworzysz ponownie JPEG. Może lepiej i szybciej byłoby tworzyć PNG, a potem JPEG.

Warto też zajrzeć do dokumentacji domtoimage. Są tam parametry width oraz height, być może już w tym momencie będziesz mógł zmienić skalę, bez potrzeby zaprzęgania PHP.


Maksymalny i optymalny rozmiar diva z którego tworzone jest zdjęcie jaki mi się udało zrobić to 1035x670 px. Potrzebuję uzyskać rozmiar do wydruku: 14,6x9,5 cm. Żeby uzyskać taki rozmiar muszę ustawić DPI na 180. W ten sposób jakość zdjęcia jest bardzo dobra i czytelna.


Tak więc skalowanie muszę przeprowadzać DPI a nie rozdzielczością.

Tym bardziej, że zmniejszając rozdzielczość tracę jakość i dochodzi blur.

Nie znajdzie się nikt, kto dałby radę przerobić to rozwiązanie w 100% na JavaScript? closedeyes.gif
trueblue
A dlaczego skalujesz obrazek w PHP pomimo, że pisałeś, że skalowanie musisz przeprowadzać tylko z pomocą DPI? W kodzie PHP używasz imagecopyresampled, choć oczywiście też podmieniasz bajty odpowiedzialne za DPI.
Gdybyś uzyskiwał obrazek w skali docelowej z samego domtoimage, to można by się pokusić o pobranie danych jako Blob i umieścić w typowanej tablicy, a niej podmienić bajty i zapisać do pliku.
rafik73
Po ostatnich przeróbkach ustawiam wymiary ma sztywno za pomocą width i height w domtoimage. A to z tego względu,że jeśli obrócę mapkę którą obramiam w Openlayers ,zmieniają się jej rozmiary - zawsze się powiększają więc cięcie do wymiaru na sztywno nie pogarsza jakości . W domtoimage istnieje funkcja toBlob. Chcesz utworzyć tablicę bajt po bajcie?

https://javascript.info/blob
trueblue
Tak.
https://javascript.info/blob#from-blob-to-arraybuffer
A z ArrayBuffer rzutować na tablicę Uint8Array. Zmienić bajty i ponownie na Blob i obrazek.
rafik73
Wersja na szybko - testowane, działa

https://github.com/shutterstock/changeDPI
trueblue
Również na identycznej zasadzie. Szkoda, że nie pokusiłeś się sam o napisanie. Na pewno skrypt byłby mniejszy wagowo.
rafik73
Można "pociąć" tą bibliotekę i wyciągnąć tylko to co potrzebne. Szczerze to na tę chwilę nie mam czasu na zabawę, ale napewno wrócę do tematu.

Pojawił się kolejny problem, tym razem z CORS. Kiedy próbuję zapisać canvas do pliku graficznego wyskakuje mi taki błąd:

[APACHE] pobierz, plaintext
  1. Uncaught (in promise) DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.
  2. at makeNodeCopy
[APACHE] pobierz, plaintext


Ma ktoś doświadczenie z CORS? Jak obejść to zabezpieczenie?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.