2012-09-23 9 views
8

Próbuję renderować obraz lokalny załadowany obiektem FileReader na kanwie w Safari Mobile na iOS6. Ale każdy obraz z adresem URL danych jest renderowany pionowo. Czy to błąd? W Chrome jest renderowany poprawnie.Mobile Safari renderuje <img src="data:image/jpeg;base64..."> skalowane na płótnie?

ScreenShot from iOS6 (powyżej: Płótno, poniżej: Original Image)

Czy istnieje jakiś sposób na obejście tego błędu? Czy to błąd?

Jeśli najpierw zmieniam rozmiar obrazu na urządzeniu przy pomocy aplikacji "PhotoWizard" (przeskaluj go do szerokości 720px), płótno renderuje go poprawnie. Wydaje się, że problem z rozmiaru obrazu lub obrazy wykonane aparatem App:

Wypróbowane sugestie Jake Archibald, wygląda nieco lepiej, ale nadal dostaje pionowo skalowane:

Wypróbowałem to już dziś na Galaxy Nexusie z zainstalowanym Androidem 4.1.1. Działa jak się spodziewano, więc to naprawdę wygląda jak mobilnego Safari numerze:

+0

Znalazłem coś podobnego podczas próby zmiany rozmiaru obrazu w JS. Patrz: – NimmoNet

+0

Jakiekolwiek obejście problemu? Próbowałem dodać pięciosekundowe opóźnienie między "onload" a uzyskaniem obrazu w/h i renderowaniem go na płótnie. Nie naprawiłem tego. Pomyślałem również o "requestAnimationFrame" przed renderowaniem obrazu na płótnie, również go nie naprawiłem. –

+0

Próbowałem użyć adresu URL Bloba w następujący sposób: window.URL.createObjectURL (plik) ... i załadować go do img.src Wyniki w tej samej awarii, renderowanie obrazu z "Blob-src" get's również renderowane pionowo skalowane na płótnie –

Odpowiedz

29

Może to być związane z ograniczeniem który rezyduje w ograniczeniu zasobów iOS Safari. Zgodnie z poniższym linkiem, pliki JPEG powyżej 2M pikseli będą podpróbkowane.

https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html#//apple_ref/doc/uid/TP40006482-SW15

mam wątpliwości, że płótno w Safari nie może poradzić sobie z tym podpróbek poprawnie.

Utworzono sposób obejścia tego problemu, sprawdzając, czy obraz jest podpróbkowany, czy nie i rozciągając go do oryginalnego rozmiaru.

https://github.com/stomita/ios-imagefile-megapixel

+0

Podczas korzystania z powyższej biblioteki Twoja próbka wygląda następująco: http://jsbin.com/aqirel/13 OK z moim iPhone5 (iOS 6.0). – stomita

+1

Utworzono demonstrację online innego widżetu do przesyłania plików, który właśnie napisałem. Może wykryć problem z renderingiem iOS. Jeśli obraz nie jest prawidłowo renderowany, obraz jest ponownie renderowany z zastosowaną poprawką. Podwajanie skali o dwójkę wydaje się naprawić, zobacz źródła dla szczegółów ... http://sandbox.juurlink.org/html5imageuploader/ –

+0

@stomita Użyłem twojej biblioteki i gdy naprawiłem problem z wysokością pionową, obraz jest pokazano w bardzo złej/niskiej rozdzielczości. Czy wiesz, w jaki sposób mogę upscale zachować rozdzielczość? –

0
var cnv = document.createElement("canvas"); 
     ctx = cnv.getContext("2d"); 

     image = new Image(); 

     image.src = src; 

     image.onload = function() { 

      var size = scaleSizeRatio(image.width,image.height); 
      cnv.width = size[0]; 
      cnv.height = size[1]; 
      ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, image.width , image.height); 

      var div = container; 
      div.appendChild(cnv);  

     } 

ctx.drawImage (zdjęcie, 0, 0, image.width, image.height, 0, 0, image.width, image.height); Ta funkcja naprawi problem z wyciśnięciem w iPodzie powyżej 3 MB. Najpierw, jeśli obraz ma więcej niż 3 MB, obliczyć skalowaną szerokość i wysokość obrazu i ustawić szerokość i wysokość na kanwie. Następnie wywołaj funkcję drawImage. Da to ostateczny obraz, którego się spodziewałeś ...

Powiązane problemy