Chociaż odpowiedź Philipa jest najlepszym sposobem, możesz zrobić to, co chcesz, całkowicie w sferze JPEG.
JPEG działa poprzez dzielenie obrazu na bloki zwane minimalnymi jednostkami kodującymi (MCU), zwykle 16 × 16, i kompresowanie ich osobno. Można to zobaczyć na zdjęciach, gdy poziom kompresji jest bardzo wysoki. Przy bardziej rozsądnych poziomach kompresji bloki łączą się tak płynnie, że nigdy nie widać granic.
Możemy skorzystać z tego faktu, aby bezstratnie dodać prostą białą ramkę do obrazu. Po prostu musimy utworzyć pustą tablicę białych bloków równą wielkości obrazu wyjściowego, a następnie upuścić oryginalne bloki MCU JPEG na środek .¹
Ta technika ma wadę: działa tylko wtedy, gdy rozmiary obrazu wejściowego i wyjściowego są równe wielokrotności rozmiaru MCU. Jeśli tak nie jest, musimy ponownie skompresować niektóre bloki na marginesie między białą ramką a krawędziami oryginalnego obrazu. Nie zobaczysz tej różnicy na wyjściu, jeśli będziesz trzymał się z dala od nadmiernie wysokich poziomów kompresji JPEG, więc nadal jest skutecznie bezstratny.
Nie znam żadnego programu, który to robi. Najbliższą rzeczą, o której wiem, jest odwrotna operacja: jpegtran ma funkcję przycinania, która bezstratnie odcina części krawędzi obrazu .² Robi to, odrzucając przycięte MCU wzdłuż krawędzi obrazu, pozostawiając te w środkowy nietknięty.
Najprostszym gotowym rozwiązaniem, jakie znam, jest wtyczka Better JPEG Lossless Resave do Photoshopa. Wykorzystuje techniki oparte na podanych wyżej pomysłach, aby kopiować MCU z oryginalnego obrazu w dowolnym miejscu, aby uniknąć ich ponownego tworzenia z wersji nieskompresowanej, jak to zwykle robi Photoshop.
Dygresje:
Możesz pomyśleć, że wynikowa ramka nie będzie całkiem biała , ponieważ utrata JPEG spowoduje pewną różnicę kolorów na wydruku. Zrobiłem kilka testów, a przynajmniej w Photoshopie, czysto biały obraz zapisany za pomocą JPEG 10 poziomu Save For Web (tzn. „Niskiej” jakości) daje zdekodowany obraz, który jest nadal czysto biały.
Ustaliłem to za pomocą dwóch testów:
Najpierw załadowałem plik JPEG jako warstwę na oryginał, ustawiłem tryb mieszania górnej warstwy na Różnica, a następnie dodałem warstwę dopasowania Poziomy nad nim, aby spróbować powiększyć różnice. Powstały obraz pozostał czarny, co oznacza „brak różnicy”.
Po drugie, kiedy nie zauważyłem oczekiwanych różnic, upuściłem warstwę dopasowania i przywróciłem warstwę JPEG do trybu normalnego mieszania, podniosłem narzędzie kroplomierza i rozejrzałem się po obrazie pod kątem piksela, który nie był wyświetlany jako RGB (255,255,255 ) w panelu Informacje. Nigdy go nie znalazłem. Spodziewałem się, że liczby zaczną migotać trochę, gdy szorowałem obraz, ale pozostały stabilne.
Mogę tylko stwierdzić, że jest to zdegenerowany przypadek algorytmu kodowania: czyste białe bloki pozostają białe przez dyskretną transformację kosinusową .
Co ciekawe, nie dzieje się tak w przypadku czystych czarnych bloków. Przynajmniej z implementacją Photoshopa zmieniają się one w RGB (1,1,1) po zdekodowaniu, a nie RGB (0,0,0).
Podsumowując, nie musisz się martwić o rozpylanie kropek w tym obszarze obramowania podczas drukowania obrazu wykonanego powyższą techniką.
jpegtran
jest programem wiersza poleceń, ale istnieje również program GUI dla systemu Windows oparty na tym samym kodzie o nazwie jpegcrop
.
Niestety, ta wtyczka jest przeznaczona tylko dla systemu Windows.
jpegtran
funkcja przycinania może być również używana do rozszerzenia. (Nie jestem jednak pewien, jaki kolor będą miały przedłużone granice.)jpegtran
można również rozszerzyć obraz, ale zawsze zawiera on zakodowany na stałe środkowy szary kolor RGB (128, 128, 128). Robi to po prostu dlatego, że jest to jedyna łatwa opcja, ponieważ w przestrzeni o współczynniku DCT można to zrobić za pomocą prostegobzero()
wywołania. Próbowałem dzikiego włamania do zmiany tego , co nie działa, ale powinno dać ci poczucie brzydoty. wznosi ręce w frustracjiNależy pamiętać, że podczas zapisywania zdjęcia w formacie stratnej kompresji tracisz jakość . Tak długo, jak zapiszesz zdjęcie w formacie bezstratnym (PSD, TIFF itp.) Po dodaniu ramki, nie stracisz więcej danych niż utraciłeś, zapisując zdjęcie jako JPEG.
źródło
Nie jest to dość bezstratne, ale możesz zbliżyć się za pomocą GIMP (lub innego edytora z podobną funkcją) i następujących dwóch sztuczek:
Najpierw upewnij się, że dodawana ramka ma wielokrotność szerokości 8 pikseli (a najlepiej wielokrotność 16 pikseli).
Jest to ważne, ponieważ algorytm kompresji JPEG dzieli obraz na bloki 8 × 8 pikseli *, zaczynając od lewego górnego rogu, i stosuje algorytm kompresji stratnej niezależnie do każdego bloku. Zatem przynajmniej w zasadzie można bezstratnie wypełniać obraz JPEG, dodając pełne bloki 8 x 8 pikseli wokół istniejących. Jeśli jednak spróbujesz dodać ramkę, która nie ma całej liczby bloków, bloki na wyściełanym obrazie nie będą się zgadzały z blokami w oryginale, a utrata kompresji byłaby nieunikniona.
*) W rzeczywistości większość obrazów JPEG używa podpróbkowania barwy , co oznacza, że tylko część obrazu w skali szarości jest faktycznie kompresowana w blokach 8 × 8, podczas gdy kanały barwy są zmniejszane o 50% przed kompresją, dzięki czemu ich efektywny rozmiar bloku wynosi 16 × 16 pikseli. Dlatego, aby uzyskać najlepsze wyniki, szerokość ramki powinna być naprawdę wielokrotnością 16 pikseli. Jednak zwykle można uniknąć obramowania 8 (lub 24 lub 40 itd.) Pikseli, ponieważ niewielka utrata kompresji w barwie nie jest bardzo zauważalna.
Druga część triku polega na zaznaczeniu pola wyboru „Użyj ustawień jakości z oryginalnego obrazu” w oknie dialogowym Eksportuj obraz jako JPEG (w Ustawieniach zaawansowanych). Zrób to, nawet jeśli wydaje się, że spowoduje to obniżenie jakości niż zwykle!
To ustawienie sprawia, że GIMP ponownie używa dokładnie takich samych ustawień kompresji, jakie były stosowane w oryginalnym obrazie, co zwykle eliminuje około 99% strat kompresji, pod warunkiem, że nie edytowałeś obrazu zbyt mocno, a zwłaszcza, że bloki w nowy obraz nadal jest zgodny z tymi w oryginale. (Czasami nadal będą występować pewne straty z powodu błędów zaokrągleń, ale znacznie mniej niż byłoby inaczej).
Aby szybko zademonstrować, wziąłem ten obraz testowy JPEG z Wikimedia Commons , pierwotnie zapisany z dość niską jakością 50, i dodałem do niego fantazyjną (w pewnym sensie) czarno-białą ramkę 8px, stosując metodę opisaną powyżej:
Oto różnica między oryginałem (15,1 kB) a edytowanym obrazem (16,7 kB), pokazanym przy użyciu trybu warstwowego „ekstrakcji ziarna” GIMP:
Możesz zobaczyć bardzo niewielkie błędy barwy, spowodowane tym, że szerokość ramki nie jest wielokrotnością 16, i (jeśli przyjrzysz się uważnie) kilka bloków, w których wystąpiły również niewielkie straty w kanale luma z powodu zaokrąglenia. Mimo to wizualnie oryginał i wypełniony obraz są prawie nie do odróżnienia, nawet przy dwukrotnym powiększeniu i na przemian między nimi.
W szczególności skontrastuj to z wynikiem podniesienia jakości JPEG z 50 do 60 przed zapisaniem wypełnionego obrazu, co daje następujący obraz 17,6 kB:
Przy dużym powiększeniu zdecydowanie widać, że edytowany obraz jest wyraźnie rozmazany w niektórych miejscach niż oryginał, a różnica w ekstrakcie z ziarna potwierdza to:
źródło
Przepraszam, jeśli nie jest to dokładnie to, czego chciałeś, ale ...
Wygląda na to, że dodajesz białą ramkę jako pomoc w ustawianiu obrazu podczas drukowania. Dlaczego nie skupić się na prawidłowym nauczeniu interfejsów drukowania i uniknąć takich podejrzanych hacków? Innym problemem, jaki się tu pojawia, jest to, że pozwalasz programowi drukującemu na zmianę rozmiaru obrazu 4680x3120 w celu dopasowania do prawidłowej DPI / rozdzielczości. Może to mieć poważniejszy efekt niż ponowne zapisanie pliku JPEG.
źródło
Poprzednie odpowiedzi są bardzo dobre.
Dodam tylko „psychologiczne aspekty” formatu jpg.
Jeśli plik jpg jest dobrze przygotowany, traci tylko około 0,5% informacji. To w zdecydowanej większości przypadków coś, czego ludzkie oko nie widzi. Potrzebujesz programu do wykonania analizy i zobaczenia różnic (takich jak analiza, którą właśnie wykonał Ilmari).
„Dobra jakość” to proces, nie tylko sposób, w jaki format pliku zapisuje obraz. Tak, ponownie skompresowałeś plik za pomocą jpg, ponieważ naprawdę go potrzebujesz. Jeśli jest to sytuacja kontrolowana, można to zrobić.
Ty naprawdę potrzebne to oznacza, że nie można użyć innego formatu bezstratnego, masz bardzo specyficzne potrzeby przechowywania lub programowo bardzo napięty pracy.
Jeśli naprawdę martwisz się jakością, prawdopodobnie nie używałbyś Paint. Format JPG ma kilka konfiguracji, których w ogóle nie można kontrolować w programie Paint.
Oto moja lista darmowych programów, w których naprawdę możesz kontrolować kompresję jpg, oraz opcję, którą musisz wybrać. (Wszystkie z nich w oknie dialogowym zapisu jpg)
Irfanview - Włącz Wyłącz podpróbkowanie kolorów chroma.
FastStone Image Viewer - podpróbkowanie kolorów: brak.
Gimp - podpróbkowanie 4: 4: 4
Wniosek. Nie używaj farby.
Jednej rzeczy jeszcze nie sprawdziłem. Jeśli wszystkie te programy zachowują osadzony profil kolorów. Zmienię swój post później.
źródło
IrfanView działa dla mnie dobrze dla zestawów obrazów. Oto kilka notatek instruktażowych
Oto moja procedura składowana do wstawiania ramki - Procedura Infran, aby dodać ramkę
źródło