Konwersja kompresji

0

Witam. Chciałbym się od Was dowiedzieć jak zmienić typ konwersji pliku, a w zasadzie nie zmienić co go w ogóle nie ruszać. Pobieram obraz korzystając z biblioteki Emgu.CV i obracam go (program służy między innymi do obracania obrazów o dany kąt). Pliki wejściowe są w konwersji Old-style JPEG (in TIFF), a wyjściowe są zas w konwersji nowej (JPEG in TIFF). Próbując zapisać obiekt jako:

Tiff tif = Tiff.Open("plik","w")
tif.SetField(TiffTag.COMPRESSION,OJPEG)

wywala mi błąd, że plik jest nieprawdiłowy. Gdy jednak zamiast OJPEG dam normalnego JPEGa wszystko działa poprawnie jednak nowopowstały obraz waży dokładnie dwa razy więcej, co wejściowy.
Jak to rozwiązać?

0
hydrant23 napisał(a):

Witam. Chciałbym się od Was dowiedzieć jak zmienić typ konwersji pliku, a w zasadzie nie zmienić co go w ogóle nie ruszać. Pobieram obraz korzystając z biblioteki Emgu.CV i obracam go (program służy między innymi do obracania obrazów o dany kąt). Pliki wejściowe są w konwersji Old-style JPEG (in TIFF), a wyjściowe są zas w konwersji nowej (JPEG in TIFF). Próbując zapisać obiekt jako:

Tiff tif = Tiff.Open("plik","w")
tif.SetField(TiffTag.COMPRESSION,OJPEG)

wywala mi błąd, że plik jest nieprawdiłowy. Gdy jednak zamiast OJPEG dam normalnego JPEGa wszystko działa poprawnie jednak nowopowstały obraz waży dokładnie dwa razy więcej, co wejściowy.
Jak to rozwiązać?

To jest tzw. problem X-Y.
Rozumiem że twoim problemem (X) jest to, że plik wyjściowy jest większy.
Jednak zamiast zastanowić się nad X i zapytać dlaczego (i jak temu przeciwdziałać), skupiłeś się na Y, czyli wersji formatu pliku, co wcale nie rozwiąże problemu.

Plik JPEG może mieć określoną jakość (quality), wyrażoną w skali od 1 do 100. Im wyższa jakość JPEG tym większy będzie plik (przy czym 100 wcale nie oznacza że kompresja jest bezstratna).
Poszukaj czy w tej twojej bibliotece można ustawiać jakość JPEG.

Typowo używa się jakości 90, co daje bardzo dobry obraz bez zniekształceń.

Jednakże: obrót jpega o 90°, 180° albo 270° oraz lustrzane odbicia tych obrotów mogą być operacją zupełnie bezstratną, o ile zastosuje się odpowiedni algorytm. Nie wiem czy jakaś biblioteka pod C# daje taką możliwość.

1 użytkowników online, w tym zalogowanych: 0, gości: 1