zmiana koloru danego piksela

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

zmiana koloru danego piksela

Nowy postprzez Krzysiu555 » sobota, 20 wrzeÅ›nia 2008, 21:49

Chciałbym się dowiedzieć czy i jak się da odnieść do konkretnego piksela w grafice (np. bit mapie) wczytanej do TImage, odczytać kolor jaki tam jest i zmienić go na inny podany.

Docelowo to ma być coś takiego że jeśli program natrafi na niebieski piksel to go zmienia na czerwony i idzie dalej. Jak się dowiem jak odnieść się do jednego piksela to powinienem już sobie poradzić.
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana

Re: zmiana koloru danego piksela

Nowy postprzez Cyfrowy Baron » sobota, 20 wrzeÅ›nia 2008, 22:14

Kod: Zaznacz cały
TColor MyColor = Image1->Canvas->Pixels[X][Y];

// dla bitmapy
Graphics::TBitmap *Bmp = new Graphics::TBitmap;
Bmp->LoadFromFile("Plik.bmp");
TColor MyColor = Bmp->Canvas->Pixels[X][Y];


Gdzie XY to współrzędne piksela.
Operacje mozna wykonywać tylko na bitmapach, a to oznacz, ze w Image również muszą być bitmapy. TCanvas nie obsługuje bezpośrednio formatu JPEG.

Polecam serwis Cyfrowy Baron dział: porady -> grafika.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: zmiana koloru danego piksela

Nowy postprzez Krzysiu555 » sobota, 20 wrzeÅ›nia 2008, 22:42

dzięki na razie nad tym nie pracuję ale jak się za to wezmę i będę miał problemy to się odezwę
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana

Re: zmiana koloru danego piksela

Nowy postprzez banita » niedziela, 21 wrzeÅ›nia 2008, 04:25

http://download.4programmers.net/MyView

tutaj jest prosty program do pracy z grafiką rastrową który kiedys napisałem. jesli będziesz potrzebował to moge udostepnic tobie kod funkcji ktore wykonuja rozne operacje na obrazie.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: zmiana koloru danego piksela

Nowy postprzez Krzysiu555 » niedziela, 21 wrzeÅ›nia 2008, 22:14

no i mam problemy... :(

zrobiłem tak:
do Image1 wczytałem bitmapę o wysokości 1 piksela i szerokości 149 na niej są rożne kolory (149 różnych kolorów)
do Image2 wczytałem identyczną bitmapę tylko że w skali szarości (jest tam 149 szarych odpowiedników)
po wciśnięciu Button1tworzę tak jakby bazę kolorów w pliku colors.ini nazwą wartości jest kolor w skali szarości, a wartością jego kolorowy odpowiednik
mam w ten sposób plik ini w którym jest lista 149 czarno białych kolorów i ich 149 kolorowych odpowiedników
do Image3 wczytuję jakąś czarno białą bitmapę - dla testu te samą na podstawie której stworzyłem bazę kolorów
po wciśnięciu Button2 odczytuje pierwszy piksel Image3 (współrzędne [0][0]) szukam takiej nazwy wartości w pliku colors.ini i zmiennej kolor przypisuję kolorowy odpowiednik tego czarno białego piksela, a potem w ten pierwszy piksel wpisuję ten kolor z bazy

oto kod:
Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int licznik;
for (licznik=0;licznik<149;++licznik) {
int kolor = Image1->Canvas->Pixels[licznik][0];
int czarny = Image2->Canvas->Pixels[licznik][0];
TIniFile *PlikIni = new TIniFile("colors.ini");
PlikIni->WriteInteger("KOLORUJ", czarny, kolor);
delete PlikIni;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int licznik;
for (licznik=0;licznik<149;++licznik) {
int czarny = Image3->Canvas->Pixels[licznik][0];
TIniFile *PlikIni = new TIniFile("colors.ini");
int kolor = PlikIni->ReadInteger("KOLORUJ", czarny, czarny);
delete PlikIni;
Image3->Canvas->Pixels[licznik][0] = kolor;
Application->ProcessMessages();
}
}
//---------------------------------------------------------------------------


coś robię nie tak bo grafika którą chcę pokolorować się zmienia ale wcale nie jest kolorowa

proszÄ™ o pomoc

PS fajny program banita, na razie nie potrzebny mi kod Twojego programu ale jak coś to się odezwę, dzięki
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    NieznanyNieznana

Re: zmiana koloru danego piksela

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 22 wrzeÅ›nia 2008, 09:01

Jeżeli wczytujesz do Image bitmapę np. 4 bitową, a potem próbujesz zmienić jej kolor o wartości np. 32 bitów, to się nie uda, gdyż Image przechowuje bitmapę 4 bitową i każde 32 bity przetworzy na 4 bity co da odpowiednik w skali szarości. Tak więc po wczytaniu do Image bitmapy o głębi bitów 4, musisz dokonać konwersji tej bitmapy na 16, 24 lub 32 bity, tak by Image mógł obsłużyć takie kolory. Bitmapa w skali szarości ma zbyt małą głębie bitów by pomieścić "bity kolorowe", może być sobie czarno biała ale musi być np. w 32 bitach.

Odsyłam jeszcze raz do serwisu Cyfrowy Baron do działu: porady -> grafika. Znajdziesz tam przykłady konwersji bitmap pomiędzy różnymi głębiami bitów. Poza tym konwersja bitmapy piksel po pikselu może się sprawdzić tylko dla małych bitmap, ale gdy przyjdzie zrobić coś takiego dla bitmapy o rozdzielczości np. 800x600 pikseli, to pętla będzie musiała wykonać 480 tys. obiegów, wliczając w to czas konieczny na wykonanie operacji na każdym pikselu, to całość może zająć kilkadziesiąt minut. Dlatego należy korzystać z funkcji ScanLine, a w przypadku określania palety kolorów znacznie efektywniej będzie posłużyć się strukturą LOGPALETTE, a przykład wykorzystania takiej palety znajdziesz w poradzie Konwersja bitmapy na szarą i monochromatyczną.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość