2011-02-15 9 views
6

Używanie WebImage z wydania MVC3/WebMatrix. Ładowanie następujący obraz ze ścieżki pliku:Dlaczego program WebImage.Resize usuwa przezroczystość PNG

Sample Image - lub - enter image description here

Running następujący kod przeciwko niej:

return new WebImage(path) 
     .Resize(120, 265) 
     .GetBytes("Png"); 

wyników w obrazie z przejrzystości okorowane i czarny stosowany w miejscu :

Blacked out transparency

To samo dzieje się z RotateRight(), Rota teLeft() i FlipHorizantal() Jednakże, jeśli nie nazywamy .Resize() metoda:

return new WebImage(path) 
     .GetBytes("Png"); 

Obraz jest zwracany bez problemu.

+0

Co to jest część obrazu internetowego? – Craigt

+0

System.Web.WebImage jest wysyłany jako część MVC3 i/lub WebMatrix. –

+1

Czy możesz zamieścić link do rzeczywistego obrazu? Usługa obrazu, której używa SO, niestety ponownie kompresuje rzeczy, więc jeśli jest coś wyjątkowego w twoim konkretnym obrazie, nie możemy tego zobaczyć. –

Odpowiedz

2

Czy Twój obraz jest 8-bitowy (kolor indeksowany)? Gdy obrazy 8-bitowe są zmieniane, często są konwertowane z kolorów indeksowanych na RGB, aby uzyskać bardziej gładki efekt. Zmiana rozmiaru obrazów bez zmiany tabeli kolorów rzadko kończy się dobrze.

Jeśli obraz jest już RGB (24-bitowy lub więcej), jest nieco bardziej złożony: Co powinien zrobić Resizer dla krawędzi obrazu, na granicy między "przezroczystymi" i "nieprzezroczystymi"? Wiele algorytmów zmiany rozmiaru zrobi coś podobnego do "uśredniania dwóch kolorów" na granicy (ponownie, aby obraz wyglądał gładko), ale większość nie ma koncepcji przezroczystości, nie mówiąc już o zdolności PNG do posiadania wielu poziomów przezierności.

Krótka odpowiedź brzmi: "to prawdopodobnie błąd" - nie jest to pełna implementacja funkcji PNG.

Rozwiązaniem może nie istnieć, ale będę próbować:

  1. Pobyt w 8-bitowym kolorze, jeśli jest to opcja, lub przekonwertować z wyprzedzeniem do 32-bit.
  2. Uzyskaj kolor lub indeks kolorów przezroczystego koloru. Po zmianie rozmiaru wymuś tę wartość jako przezroczystą. Zwróć uwagę, że ze względu na wspomniane powyżej "wygładzanie" krawędzie między przezroczystymi i nieprzezroczystymi mogą nie być tego koloru i prawdopodobnie będą wyglądały jak mieszanka czerni i dowolnego koloru, jaki naprawdę chcesz.
  3. Jeśli nic innego, może być konieczne użycie zewnętrznej biblioteki, która zapewnia większą kontrolę.
+0

Wiem, że to działa z WPF/System.Windows.Imaging.Media, więc być może będę musiał powrócić do wielkich pistoletów na tym. –

0

Czy próbowałeś użyć metody Write() zamiast GetBytes()?

+0

'Write()' niestety wywołuje 'GetBytes()' pod sceną. –

Powiązane problemy