2010-07-07 16 views
5

Tytuł prawie wyjaśnia moje pytanie. Chciałbym móc czytać i zapisywać dane JPEG w przeliczeniu na piksel za pomocą C#.Jak mogę odczytać i zapisać dane JPEG w ujęciu pikselowym?

myślę coś wzdłuż linii CreateJPEG(x, y) które utworzonych pustego obrazu JPEG w pamięci, a dałby mi obiekt JPEG, a następnie coś SetPixel(x, y, Color) i GetPixel(x, y) z czego ten ostatni zwróci Color lub coś podobny. Można na przykład wywołać metodę Apply() lub Save(), aby zapisać obraz w standardowym formacie odczytywanym w formacie JPEG (najlepiej z opcjami kompresji, ale nie jest to konieczne).

Zakładam, że jakaś biblioteka C# lub przestrzeń nazw czyni to bardzo łatwym procesem, chciałbym tylko wiedzieć, jak najlepiej to wykorzystać.

+0

Należy pamiętać, że zmiana pojedynczego piksela obrazu zakodowanego w formacie JPEG powoduje, że więcej pikseli obrazu zmieni się ze względu na nietrwałe narzędzia JPEG kompresji. –

+0

Tylko uwaga dotycząca formatu JPEG - ponieważ jest to kompresja stratna, kolor pojedynczego piksela może się zmieniać między zapisami, nawet jeśli nie zmieniłeś go bezpośrednio, więc nie polegaj na pozostających stałych kolorach pikseli EDYCJA: pobity :) –

+0

Dobrze;) Pytałem, ponieważ chciałbym spróbować swoich sił w pisaniu oprogramowania do porównywania obrazów, zasadniczo biorąc pod uwagę 2 obrazy, tworząc bitmapę różnic. Wiem, że już dawno to zrobiono, ale to byłaby dobra praktyka dla mnie, a ja po prostu potrzebowałem szybkiego punktu we właściwym kierunku (coś SO jest naprawdę dobre dla, faktycznie). :) – qJake

Odpowiedz

9

Zobacz klasę Bitmap. W przypadku zaawansowanego rysowania poza manipulowaniem pojedynczym pikselem będziesz musiał użyć klasy Graphics.

var image = new Bitmap("foo.jpg"); 

var color = image.GetPixel(1, 2); 
image.SetPixel(42, 42, Color.White); 

image.Save("bar.jpg", ImageFormat.Jpeg); 

Jak wspomina Lasse V. Karlsen w swojej odpowiedzi, tak naprawdę nie manipuluje plikiem JPEG. Plik JPEG zostanie zdekompresowany, dane obrazu zostaną zmienione, a po zapisaniu nowy plik JPEG zostanie utworzony ze zmienionych danych obrazu.

Spowoduje to obniżenie jakości obrazu, ponieważ nawet ponowne kompresowanie niezmienionego obrazu zazwyczaj nie daje identycznego pliku JPEG z powodu natury stratnych kompresji JPEG.

Istnieje kilka operacji, które można wykonać na plikach JPEG bez dekompresji i ponownej kompresji - na przykład obracanie o 90 ° - operowanie pojedynczymi pikselami nie mieści się w tej kategorii.

+1

"Kompresja bezstratna"? Masz na myśli stratę. – Dykam

+0

Dość możliwe ...: D Thx! –

8

JPEG nie jest formatem przetwarzania, jest to format przechowywania.

Jako takie, w rzeczywistości nie używasz obrazu JPEG w pamięci, masz tylko obraz. Dopiero po zapisaniu wybierasz format, np. PNG lub JPEG.

Jako takie, myślę, że szukasz klasy Bitmap w .NET.

Powiązane problemy