20. oktober 2001 - 21:11Der 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???
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;
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;
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....
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;
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)
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....
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!!!)
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.