Avatar billede cautoo Nybegynder
29. juli 2001 - 20:05 Der er 18 kommentarer og
1 løsning

HJÆÆLP -=HASTER=-

er det ikk muligt at flytte på componenter i en form så man eks. kan lave en rulletekst???

når jeg prøver med TTimer og left := left+1 så hakker den enormt meget hvordan undgår jeg det????

og så har jeg også et andet problem jeg er ved at lave et billedredigeringsprogram og her har jeg tænkt mig at lave noget hvor det toner et andet billede frem det har jeg lavet. Jeghar lavet det med en X og Y for løkke men når den så skal til at lege med de store billeder tager det enormt langt tid hvorimod hvis jeg tager nogle af de der multimedia komponenter så kan det sagtens lade sig gøre at rendere nogle stykker i sekundet hvordan kan jeg gøre min for løkke hurtigere?????
Avatar billede borrisholt Novice
29. juli 2001 - 20:08 #1
http://borrisholt.com finder du dels en løsning på hvordan du laver en rulle tekst, den liggerunder VCL hack.

Der udover er der også under Grapichs nogle grafik biblotekter til brug for folk der bil leje lidt meg grafik ...

Jens B
Avatar billede poull Nybegynder
29. juli 2001 - 20:10 #2
Jo men hvis du flytter selve componenten vil det altid flikker lidt.

Hvad er det for en component du flytter?
Avatar billede borrisholt Novice
29. juli 2001 - 20:12 #3
har du hentet eksemplet ?

Jens B

Avatar billede cautoo Nybegynder
29. juli 2001 - 20:13 #4
nej det vil ikk jeg ved ikk om det er min computer der pludselig ikk vil hente
Avatar billede cautoo Nybegynder
29. juli 2001 - 20:14 #5
og det er når jeg flytter TLabel at det hakker (skulle gerne være gennemsigtigt samme tid
Avatar billede cautoo Nybegynder
29. juli 2001 - 20:17 #6
og hvilken af disse er det???
ScrollText.zip (3,02 Kb)
VerticalText.zip (1,69 / 2,79 Kb)
Avatar billede poull Nybegynder
29. juli 2001 - 20:18 #7
Undgå at flytte component og tegn ligesom borrisholt(selv om det også er lidt svær kode at lave for mig)
Avatar billede cautoo Nybegynder
29. juli 2001 - 20:27 #8
i scroll eksemplet er teksten ikke gennemsigtigt og jeg kan ikke brgue fade eksemplet da det ikk forklarer hvorfor min egen kode er langsomere
Avatar billede borrisholt Novice
30. juli 2001 - 07:43 #9
cautoo  >>
det er ScrollText.zip du skal bruge. Du skal bare lave baggrunden transperent. Det er ikke så svært.
  Problemet med din kode er du au ændere een pixel af gangen og så tegner skærmen op. Det må nødvendig vis gå galt !

Jens B
Avatar billede cautoo Nybegynder
30. juli 2001 - 11:20 #10
jamen hvordan gør jeg så dette hutigere????

procedure TForm1.Button2Click(Sender: TObject);
var
  r,g,b: Integer;
  r1,g1,b1: Integer;
  X, Y: Integer;
  tal: Integer;
begin
  tal := TrackBar1.Position;
  Image3.Height := Image1.Height;
  Image3.Width := Image1.Width;
  for Y := 0 to Image1.Height do
  begin
    for X := 0 to Image1.Width do
    begin
      r:=GetRValue(Image1.Canvas.Pixels[x,y]);
      g:=GetGValue(Image1.Canvas.Pixels[x,y]);
      b:=GetBValue(Image1.Canvas.Pixels[x,y]);
      r1:=GetRValue(Image2.Canvas.Pixels[x,y]);
      g1:=GetGValue(Image2.Canvas.Pixels[x,y]);
      b1:=GetBValue(Image2.Canvas.Pixels[x,y]);
      r := Round((r/100*tal) + (r1/100*(100-tal)));
      g := Round((g/100*tal) + (g1/100*(100-tal)));
      b := Round((b/100*tal) + (b1/100*(100-tal)));
      Image3.Canvas.Pixels[x,y] := RGB(r,g,b);
    end;
  end;
  Label5.Caption := IntToStr(100-TrackBar1.Position);
  Label6.Caption := IntToStr(TrackBar1.Position);
end;
Avatar billede borrisholt Novice
30. juli 2001 - 12:24 #11
cautoo  >>
  Nu fortæller du ikke hvor mange farver der er i din bitmap der gik jeg ud fra der var 24Bit. Jeg loader mine bitmaps fra filer, me de kunne ligeså godt kommer fra en image kontrol. (vist i den ud kommenteret tekst.


  Jeg har med vilje ikke skrevet kommentarer til koden, fordi jeg syned du skal gøre det, fordi deraf får du forståelsen af hvad der sker. Det må være din opgave at re publicere koden med kommentarer, samt forklare den måbende hob hvordan det her skidt virker.


const
  PixelCountMax = 32768;

type
  pRGBArray  = ^TRGBArray;
  TRGBArray  = array[0..PixelCountMax-1] of TRGBTriple;
  EImageProcessingError = class (Exception);

procedure TForm1.Button2Click(Sender: TObject);
var
  OriginalBitmap1, OriginalBitmap2 : TBitmap;
  DetsBitmap : TBitmap;

  r,g,b: Integer;
  r1,g1,b1: Integer;
  X, Y: Integer;
  tal: Integer;

  RowOriginal1 :  pRGBArray;
  RowOriginal2 :  pRGBArray;
  RowProcessed :  pRGBArray;
begin
  OriginalBitmap1 := TBitmap.Create;
  OriginalBitmap1.LoadFromFile(\'D:\\PROGRAM FILES\\BORLAND\\Delphi6\\Projects\\P0004617.BMP\');
  //Assign(Image1.Picture.Bitmap);
  OriginalBitmap2 := TBitmap.Create;
//  OriginalBitmap2.Assign(Image2.Picture.Bitmap);
  OriginalBitmap2.LoadFromFile(\'D:\\PROGRAM FILES\\BORLAND\\Delphi6\\Projects\\P0004615.BMP\');


  if (OriginalBitmap1.PixelFormat = pf24bit) and (OriginalBitmap2.PixelFormat= pf24bit) then
  begin
    DetsBitmap := TBitmap.Create;
    DetsBitmap.PixelFormat := pf24Bit;

    tal := TrackBar1.Position;
    DetsBitmap.Height := OriginalBitmap1.Height;
    DetsBitmap.Width := OriginalBitmap1.Width;

    for Y := 0 to OriginalBitmap1.Height-1 do
    begin
      RowOriginal1  := pRGBArray(OriginalBitmap1.Scanline[y]);
      RowOriginal2  := pRGBArray(OriginalBitmap2.Scanline[y]);
      RowProcessed := pRGBArray(DetsBitmap.Scanline[y]);

      for X := 0 to OriginalBitmap1.Width-1 do
      begin
        r:= RowOriginal1[x].rgbtRed;
        g:= RowOriginal1[x].rgbtGreen;
        b:= RowOriginal1[x].rgbtBlue;

        r1 := RowOriginal2[x].rgbtRed;
        g1 := RowOriginal2[x].rgbtGreen;
        b1 := RowOriginal2[x].rgbtBlue;

        r := Round((r/100*tal) + (r1/100*(100-tal)));
        g := Round((g/100*tal) + (g1/100*(100-tal)));
        b := Round((b/100*tal) + (b1/100*(100-tal)));

        RowProcessed[x].rgbtRed  := r;
        RowProcessed[x].rgbtGreen := g;
        RowProcessed[x].rgbtBlue  := b;
      end;
    end;

    Label5.Caption := IntToStr(100-TrackBar1.Position);
    Label6.Caption := IntToStr(TrackBar1.Position);
  end;
  DetsBitmap.SaveToFile(\'Hest.bmp\');
  //Image3.Picture.Bitmap.assign(DetsBitmap);
end;

hvis dit billede kun har 8bit farver (256) eller 1bit (8) Så har jeg også en løsning på det, men først efter du har redegjort for hvordan der her virker ..

Jens B
Avatar billede borrisholt Novice
30. juli 2001 - 12:26 #12
ææh ups. Jeg fik aldrig rydet op efter mig ....

Brug det her kode i stedet :

const
  PixelCountMax = 32768;

type
  pRGBArray  = ^TRGBArray;
  TRGBArray  = array[0..PixelCountMax-1] of TRGBTriple;
  EImageProcessingError = class (Exception);

procedure TForm1.Button2Click(Sender: TObject);
var
  OriginalBitmap1, OriginalBitmap2, DetsBitmap : TBitmap;

  r,g,b: Integer;
  r1,g1,b1: Integer;
  X, Y: Integer;
  tal: Integer;

  RowOriginal1 :  pRGBArray;
  RowOriginal2 :  pRGBArray;
  RowProcessed :  pRGBArray;
begin
  OriginalBitmap1 := TBitmap.Create;
  OriginalBitmap1.LoadFromFile(\'D:\\PROGRAM FILES\\BORLAND\\Delphi6\\Projects\\P0004617.BMP\');
  //Assign(Image1.Picture.Bitmap);
  OriginalBitmap2 := TBitmap.Create;
//  OriginalBitmap2.Assign(Image2.Picture.Bitmap);
  OriginalBitmap2.LoadFromFile(\'D:\\PROGRAM FILES\\BORLAND\\Delphi6\\Projects\\P0004615.BMP\');

  DetsBitmap := TBitmap.Create;
  DetsBitmap.Height := OriginalBitmap1.Height;
  DetsBitmap.Width := OriginalBitmap1.Width;


  if (OriginalBitmap1.PixelFormat = pf24bit) and (OriginalBitmap2.PixelFormat= pf24bit) then
  begin
    DetsBitmap.PixelFormat := pf24Bit;

    tal := TrackBar1.Position;

    for Y := 0 to OriginalBitmap1.Height-1 do
    begin
      RowOriginal1 := pRGBArray(OriginalBitmap1.Scanline[y]);
      RowOriginal2 := pRGBArray(OriginalBitmap2.Scanline[y]);
      RowProcessed := pRGBArray(DetsBitmap.Scanline[y]);

      for X := 0 to OriginalBitmap1.Width-1 do
      begin
        r:= RowOriginal1[x].rgbtRed;
        g:= RowOriginal1[x].rgbtGreen;
        b:= RowOriginal1[x].rgbtBlue;

        r1 := RowOriginal2[x].rgbtRed;
        g1 := RowOriginal2[x].rgbtGreen;
        b1 := RowOriginal2[x].rgbtBlue;

        r := Round((r/100*tal) + (r1/100*(100-tal)));
        g := Round((g/100*tal) + (g1/100*(100-tal)));
        b := Round((b/100*tal) + (b1/100*(100-tal)));

        RowProcessed[x].rgbtRed  := r;
        RowProcessed[x].rgbtGreen := g;
        RowProcessed[x].rgbtBlue  := b;
      end;
    end;

    Label5.Caption := IntToStr(100-TrackBar1.Position);
    Label6.Caption := IntToStr(TrackBar1.Position);
  end;

  //Image3.Picture.Bitmap.assign(DetsBitmap);

  DetsBitmap.SaveToFile(\'Hest.bmp\');
  OriginalBitmap1.free;
  OriginalBitmap2.free;
  DetsBitmap.free;

end;
Avatar billede cautoo Nybegynder
30. juli 2001 - 16:26 #13
hva gør det hurtigere?
Avatar billede borrisholt Novice
31. juli 2001 - 07:52 #14
Hmmnnn. Det troede jeg var åbenlyst ....

Du henter din pixel helt ude på sklrmen, og stopper den tilbage HVER gang ....

I/O tager meget langtid, fordi man hvergang skal vente på Hardwaren.

Jeg der i mod ligger det hele ud i rammen. Så er det hele blot talt. Det er ikke pixels blot tal, som jeg laver nogle beregninger på. Det går stærkt !

Jens B
Avatar billede cautoo Nybegynder
31. juli 2001 - 12:15 #15
tak så må jeg bruge den kode fremover :-))
Avatar billede borrisholt Novice
31. juli 2001 - 12:37 #16
cautoo>> Du bør nu stasig væk sætte dig ned og finde ud præcis hvordan koden virker og hvorfor. For så at skrive kommentarer i koden.

Jens B
Avatar billede cautoo Nybegynder
01. august 2001 - 11:07 #17
det eneste jeg ikk helt fatter er hva denne kommando gør:
      RowOriginal1 := pRGBArray(OriginalBitmap1.Scanline[y]);
      RowOriginal2 := pRGBArray(OriginalBitmap2.Scanline[y]);
      RowProcessed := pRGBArray(DetsBitmap.Scanline[y]);
Avatar billede borrisholt Novice
01. august 2001 - 11:29 #18
cautoo >>
  En bitmap er byyger op af en BITMAPHEADDERINFO struktur, samt et to dimmensionelt array af pixels.

Afhænigt af hvilken type birmat det er 8bit, 24bit, 32Bit etc er disse pixels af forskelligt format.

De \"vandrette\" linjer i en bitmap klades Scanlinjer.

I dit tilfælde arbejder du med en 24Bits Bitmap, og her er en pixel en TRGBTriple.

en TRGBTriple er defineret i Windows således :

  tagRGBTRIPLE = packed record
    rgbtBlue: Byte;
    rgbtGreen: Byte;
    rgbtRed: Byte;
  end;
  TRGBTriple = tagRGBTRIPLE;

Altså en scanlinje er af typen  TRGBArray i et 24Bits bitmap. Hvis hu kalder OriginalBitmap1.Scanline[y] får du en pointer til ScanLine nummer \'y\'. da vi nu ved det er en 24Bits bitmap så ved vi at det er en pointer til et array af TRGBTriple. Desværre har borland ikke defineret sådan en type så derfor gør jeg det :

const
  PixelCountMax = 32768;
type
  pRGBArray  = ^TRGBArray;
  TRGBArray  = array[0..PixelCountMax-1] of TRGBTriple;


DDet smaret er nu at jeg bare kan indexsere ud i remmen fordi jeg kender højde og brede på min bitmap.

Hjalp det ?

Jens B
Avatar billede cautoo Nybegynder
01. august 2001 - 11:33 #19
yep altid rart at kunne lære noget :-)


Tak for hjælpen.
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