Właściwe użycie funkcji SetPixel dla dla obiektu typu Bitmap

0

Witam.

Jestem początkującym programistą w VS C#. Do tej pory pisałem wszystko praktycznie w C++, konsolowo.

Mam taki oto problem, pewnie dla wielu banalny:

Stworzyłem sobie nowy obiekt typu Bitmap (zawartość wczytanego obrazka):

displayedBitmap = new Bitmap(tempPattern);

Następnie przekopiowałem jego zawartość do obiektu klasy RGBColor stworzonego przez mnie:

bitmapColors = new RGBColor[this.displayedBitmap.Width, this.displayedBitmap.Height];
                    int i, j;
                    for (i = 0; i < this.displayedBitmap.Width; i++)
                        for (j = 0; j < this.displayedBitmap.Height; j++)
                        {
                            bitmapColors[i, j] = new RGBColor(this.displayedBitmap.GetPixel(i, j));
                           
                        }

Za pomocą funkcji R,G,B klasy RGBColor można otrzymać poszczególne składowe danego kolory RGB (funkcja zwraca typ ulong), np:

ulong k;
k=bitmapColors[i, j].R;

Teraz chciałbym zawartość obiektu bitmapColors ponownie przenieść do obiektu typu Bitmap:

Wiem, że odpowiednikiem funkcji GetPixel przy wstawianiu danego pixela jest SetPixel, lecz nie wiem, jak odpowiednio wstawić wartość koloru z wykorzystaniem mojego obiektu bitmapColors?

Mam ponownie pętle:

for (i = 0; i < this.displayedBitmap.Width; i++)
                        for (j = 0; j < this.displayedBitmap.Height; j++)
                        {
                            this.displayedBitmap.SetPixel(i, j, ?); <- jak właściwie przepisać/ przekonwertować  komórkę mojego obiektu bitmapColors do obiektu typu Bitmap??

                          
                        }
0

Chyba tak:

this.displayedBitmap.SetPixel(i, j, Color.FromArgb(bitmapColors[i, j].R, bitmapColors[i, j].G, bitmapColors[i, j].B)); 

Ale to trochę dziwne jest, po co w ogóle to bitmapColors?

Poza tym przetwarzanie Bitmap przez GetPixel/SetPixel jest bardzo niewydajne.

0

Stworzyłem sobie nowy obiekt typu Bitmap (zawartość wczytanego obrazka):
displayedBitmap = new Bitmap(tempPattern);

okeej...

Następnie przekopiowałem jego zawartość do obiektu klasy RGBColor stworzonego przez mnie:
bitmapColors = new RGBColor[this.displayedBitmap.Width, this.displayedBitmap.Height];

bez sensu: tworzysz kopię całej swojej bitmapy w postaci tablicy pikseli. po co, skoro możesz bezpośrednio wywoływać GetPixel/SetPixel na bitmapie?

Poza tym przetwarzanie Bitmap przez GetPixel/SetPixel jest bardzo niewydajne.
prawda, ale taka tablica bitmapColors tego problemu nie rozwiązuje, tylko pogłębia.

pytanie do autora wątku: jaką operację chcesz na bitmapie przeprowadzić?

0

Chodzi mi o przeprowadzanie późniejszych operacji edycji wczytanego obrazka (rotacja, skalowanie itp).

0

Operacje jak obracanie, skalowanie możesz spróbować zrobić za pomocą klasy Graphics.

Bitmap bmp = new Bitmap(filePath);
Graphics gr = Graphics.FromImage(bmp);

Masz tam metody ScaleTransform() i RotateTransform.
Może dla Twoich zastosowań nie potrzebujesz operować na poziomie pixeli, czy poszczególnych kolorów? Może wystarczy Ci to co oferuje klasa Graphics. Jej możliwości są na prawdę duże.
Pozdrawiam

0

A jeśli faktycznie trzeba operować na poszczególnych bajtach obrazu, to do tego służy klasa BitmapData: http://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.aspx

0

Chodzi mi o przeprowadzanie późniejszych operacji edycji wczytanego obrazka (rotacja, skalowanie itp).

było kilka razy tu na forum, różnymi metodami, z podanymi przykładami. proponowana przez ciebie będzie BARDZO powolna.

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