1 Ostatnio edytowany przez vega (2009-07-14 20:58:12)

W programie, który piszę jest taka oto instrukcja:


             color0:= image1.picture.bitmap.Canvas.Pixels[0+hlp_i,hlp_ii+(iii)];


pobiera mi ona kolor pixel'a w formacie RGB z obrazka (obrazek ma palete 256 kolorów)
np: dla niebieskiego pixel'a otrzymuje $00FF0000
      dla zielonego                               $0000FF00 itp. 


Jednak mi jest potrzebny numer(indeks) w palecie kolorów dla tego pixel'a ......a nie już konkretna barwa w formacie RGB.

Jak uzyskać numer indeksu w palecie kolorów?

2

wczytaj jako binarke i obsluz recznie,  po wczytaniu w bitmape raczej dostaniesz  koordynaty koloru w device indenpedent color space

przechodze na tumiwisizm

3

jeśli nie ustawiłeś PixelFormat:=pf8bit, to domyślnie obrazki w Delphi mają pf24bit

w przechwytywanie palet nie bawiłem się, ogólnie przeglądam obrazek i wstawiam kolor RGB (CARDINAL) do tablicy, w ten sposób otrzymuje paletę kolorów, a na jej podstawie indeksowane dane bitmapy

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

4

vega, a dane skąd bierzesz?

5 Ostatnio edytowany przez vega (2009-07-14 23:38:19)

xan:

dane wczytałem z pliku *.BMP:
           Image1.Picture.LoadFromFile(FileListBox1.FileName);



W sumie już sobie poradziłem z tym problemem w końcu...doszedłem metodą prób i błędów do rozwiązania...łatwo nie było

1. Wyciągnąłem palete najpierw:

    GetPaletteEntries(image1.Picture.Bitmap.Palette,0,255,paleta);
    GetMem(pal, sizeof(TLogPalette) + sizeof(TPaletteEntry) * 255);
    pal.palVersion := $300;
    pal.palNumEntries := 256;

2. Później szukałem koloru w tej palecie (i otrzymywałem index):

function get_index_palette(color: Tcolor): TColor;
label
   next1;
begin
    for i:=0 to 255 do begin
      red:= paleta[i].peRed;
      green:= paleta[i].peGreen;
      blue:= paleta[i].peBlue;
      r_col:= getRvalue(color);
      g_col:= getGvalue(color);
      b_col:= getBvalue(color);

      if red=r_col then
      if green=g_col then
      if blue=b_col then begin get_index_palette:= (i and 3); goto next1 end;  // only 4 colors on ATARI
    end;

next1:

end;

6

dzięki Vega :) pewnie skorzystam z kodu

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

7

omg ale masakra, nie lepiej to bylo wrzucic bitmape na pamiec i czytac dane bezposrednio?

8

jednak można prościej z użyciem ShellAPI

http://www.experts-exchange.com/Program … 68863.html

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C