Avatar billede zerohero Nybegynder
20. oktober 2001 - 21:11 Der er 17 kommentarer og
1 løsning

ScanLine vs. Pixels

for x := 0 to image1.picture.width do
for y := 0 to image1.picture.height do
begin
  r := getrvalue(image1.canvas.pixels[x,y]);
  g := getgvalue(image1.canvas.pixels[x,y]);
  b := getbvalue(image1.canvas.pixels[x,y]);
end;

Hvordan kan jeg gøre det samme men med ScanLine???
Avatar billede speedy Nybegynder
20. oktober 2001 - 22:07 #1
type
  TRGBArray    = array[0..0] of TRGBTriple;
  pRGBArray    = ^TRGBArray;


var
  r, g, b: Byte;
  x, y: integer;
  P: pRGBArray;
for y := 0 to bitmap.Height -1 do
  begin
    P := BitMap.ScanLine[y];
    for x := 0 to bitmap.Width -1 do
      begin
        r := p[x].rgbtRed;
        g := p[x].rgbtGreen;
        b := p[x].rgbtBlue;
      end;
  end;


/SpEeDy
Avatar billede speedy Nybegynder
20. oktober 2001 - 22:24 #2
desuden kan du læse en masse om scanline her :
http://homepages.borland.com/efg2lab/ImageProcessing/Scanline.htm

/SpEeDy
Avatar billede zerohero Nybegynder
21. oktober 2001 - 12:59 #3
SpEeDy>> tak for hjælpen, men hvordan sætter jeg så pixels via scanline, hvis jeg har alle pixels i en record som denne:

type
  MyRGB = record
  r,g,b : byte;
  end;

var
  RGBList : array of MyRGB;
Avatar billede speedy Nybegynder
21. oktober 2001 - 13:03 #4
Du kanbare gøre det omvendt sådan her:

type
  TRGBArray    = array[0..0] of TRGBTriple;
  pRGBArray    = ^TRGBArray;


var
  r, g, b: Byte;
  x, y: integer;
  P: pRGBArray;
for y := 0 to bitmap.Height -1 do
  begin
    P := BitMap.ScanLine[y];
    for x := 0 to bitmap.Width -1 do
      begin
        p[x].rgbtRed := r;
        p[x].rgbtGreen := g;
        p[x].rgbtBlue := b;
      end;
  end;


/SpEeDy
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:07 #5
Men jeg synes ikke rigtigt det virker!!!
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:12 #6
Jeg vil have kopiert alle pixels fra et bitmap over til et record som omdanner alle rgb værdier til character altså: chr(r),chr(g), chr(b) - for at spare plads! Derefter skal alle pixels så vises på en anden bitmap med ord(r), ord(g), ord(b) men det virker ikke....
Avatar billede speedy Nybegynder
21. oktober 2001 - 13:31 #7
jeg har ikke lige Delphi ved mig nu, så jeg ved ikke helt hvordan man gør. Du kan prøve dette, men som sagt kan jeg ikke lige teste...:

var
  r, g, b: Byte;
  x, y: integer;
  P: pRGBArray;
for y := 0 to bitmap.Height -1 do
  begin
    P := BitMap.ScanLine[y];
    for x := 0 to bitmap.Width -1 do
      begin
        p[x]^.rgbtRed := r;
        p[x]^.rgbtGreen := g;
        p[x]^.rgbtBlue := b;
      end;
  end;

/SpEeDyu
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:33 #8
type
  MyRGB = record
  r,g,b : char;
  end;

type
  TRGBArray    = array[0..0] of TRGBTriple;
  pRGBArray    = ^TRGBArray;
procedure TForm1.SpeedButton2Click(Sender: TObject);
var
x, y, i  : integer;
MyBit : Tbitmap;
P    : pRGBArray;
RGBList : array of MyRGB;
begin
  i := 0;
  progressbar1.position := 0;
  with image1.picture do
  begin
    progressbar1.max := width*height;
    setlength(RGBList,width*height);
    for y := 0 to height-1 do
    begin
      P := bitmap.scanline[y];
      for x := 0 to width -1 do
        begin
          RGBList[i].r := chr(p[x].rgbtred);
          RGBList[i].g := chr(p[x].rgbtgreen);
          RGBList[i].b := chr(p[x].rgbtblue);
          i := i+1;
          progressbar1.position := i;
        end;
    end;
  end;

  MyBit := TBitmap.create;
  i := 0;
  progressbar1.position := 0;
  with MyBit do
  begin
    width := image1.picture.width;
    height := image1.picture.height;
    for y := 0 to height-1 do
    begin
      P := MyBit.scanline[y];
      for x := 0 to width -1 do
        begin
          p[x].rgbtred  :=  ord(RGBList[i].r)-10;
          p[x].rgbtgreen :=  ord(RGBList[i].g)-10;
          p[x].rgbtblue  :=  ord(RGBList[i].b)-10;
          i := i+1;
          progressbar1.position := i;
        end;
    end;
  end;
  image2.picture.assign(MyBit);
  MyBit.free;
end;

...
Burde dette ikke at virke??? (eller er det mig der er dum :-P)
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:39 #9
Det virker desværre ikke ERROR: pointer required
Avatar billede speedy Nybegynder
21. oktober 2001 - 13:40 #10
okay. Men hvad er fejlen i dit eksempel ?
Avatar billede speedy Nybegynder
21. oktober 2001 - 13:40 #11
for mig at se virker det logisk at gøre det sådan, men kommer den med fejl, eller gør den det ikke eller hvad er problemet med din metode ?
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:44 #12
Der kommer ingen fejl-meddelser!
Jeg har testet om der overhovedet kommer noget over i min Record Array altså RGBList og det gør der... men den vil ikke spytte pixels ud på MyBit, så MyBit er bare helt hvid....
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:48 #13
Jeg har også prøvet med pixels metoden for at se om det overhovedet kan lade sig gøre det med chr() og ord() - og det kan det godt (Så det ikke der skoen trygger!!!)
Avatar billede zerohero Nybegynder
21. oktober 2001 - 13:50 #14
Det må være i sidste led hvor scanline skal sætte pixels på MyBit at det går galt!!!!
Avatar billede speedy Nybegynder
21. oktober 2001 - 13:52 #15
hvorfor skriver du -10 i linierne ??

          p[x].rgbtred  :=  ord(RGBList[i].r)-10;
          p[x].rgbtgreen :=  ord(RGBList[i].g)-10;
          p[x].rgbtblue  :=  ord(RGBList[i].b)-10;

/SpEeDy
Avatar billede speedy Nybegynder
21. oktober 2001 - 13:53 #16
Det burde være rigtigt ifølge den side jeg henviste til gør man som du gør. Så jeg kan ikke se hvad det er der går galt ?
/SpEeDy
Avatar billede zerohero Nybegynder
21. oktober 2001 - 14:09 #17
Jeg sriver -10 for at gøre alle pixels lidt mørkere - det skulle egentligt slet ikke have været med...
Avatar billede zerohero Nybegynder
21. oktober 2001 - 14:13 #18
hmmmm :-(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester