Avatar billede cautoo Nybegynder
22. august 2001 - 08:42 Der er 17 kommentarer og
1 løsning

HASTER MEGET

Hjjælp jeg har et script der ser sådan her ud:

procedure TForm11.aktiv(tal: Integer);
var
  nyttal: Integer;
  x, y: Integer;
  OriginalBitmap1, OriginalBitmap2, OriginalBitmap3, DetsBitmap : TBitmap;
  r2, g2,b2: Integer;
  r,g,b: Integer;
  r1,g1,b1: Integer;
  RowOriginal1 :  pRGBArray;
  RowOriginal2 :  pRGBArray;
  RowOriginal3 :  pRGBArray;
  RowProcessed :  pRGBArray;
begin
  nyttal := (StrToInt(Form9.ListBox1.Items[tal]))-1;
  CoolWindowPopup18.indsaetbillede(nyttal);
  OriginalBitmap1 := TBitmap.Create;
  OriginalBitmap1.Assign(Image2.picture.bitmap);


  nyttal := (StrToInt(Form10.ListBox1.Items[tal]))-1;
  CoolWindowPopup24.indsaetbillede(nyttal);
  OriginalBitmap2 := TBitmap.Create;
  OriginalBitmap2.Assign(image3.Picture.Bitmap);

  nyttal := (StrToInt(Form12.ListBox1.Items[tal]))-1;
  Form12.indsaetbillede(nyttal);
  OriginalBitmap3 := TBitmap.Create;
  OriginalBitmap3.Assign(image4.Picture.Bitmap);
  DetsBitmap := TBitmap.Create;
  DetsBitmap.Height := OriginalBitmap1.Height;
  DetsBitmap.Width := OriginalBitmap1.Width;


  DetsBitmap.PixelFormat := pf24Bit;
  Memo1.clear;
  for Y := 0 to OriginalBitmap1.Height-1 do
  begin
    RowOriginal1 := pRGBArray(OriginalBitmap1.Scanline[y]);
    RowOriginal2 := pRGBArray(OriginalBitmap2.Scanline[y]);
    RowOriginal3 := pRGBArray(OriginalBitmap3.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;

      r2 := RowOriginal3[x].rgbtRed;
      g2 := RowOriginal3[x].rgbtGreen;
      b2 := RowOriginal3[x].rgbtBlue;

      Memo1.lines.text := memo1.lines.text + IntToStr(r2) + \', \';


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

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


  Image1.Picture.Bitmap.assign(DetsBitmap);

  OriginalBitmap1.free;
  OriginalBitmap2.free;
  DetsBitmap.free;


end;

i første omgang har jeg bare ladet image4 være hvid så det kun burde være image2 der bliver vist i image1 men jeg får nogle sjove reslutater nogen gange ændrer den farven helt og andre gange er der bare streger ned igennem

Selvom image4 er helt hvidt (jeghar prøvet at bede den om at udskrive alle tal i image4) så er hver tredie tal = 0
Avatar billede cautoo Nybegynder
22. august 2001 - 08:48 #1
kommre tilbage senere er nød til at tage i skole :-((
Avatar billede nico26 Nybegynder
22. august 2001 - 09:11 #2
ScanLine virker vist kun for 8 bit bitmaps
Avatar billede poull Nybegynder
22. august 2001 - 11:34 #3
Nej jeg har da før set scanLine blive brugt med 24 bit
Avatar billede cautoo Nybegynder
22. august 2001 - 11:38 #4
det dur fint med 24 bit
Avatar billede cautoo Nybegynder
22. august 2001 - 11:42 #5
som i ka se har jeg valgt at se hvor meget af den røde farve der er i det ene billede som er helt hvidt så den burde jo hele t iden være 255 men jeg har prøvet at få den til at udskrive det og så giver den:
255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0,
Avatar billede nico26 Nybegynder
22. august 2001 - 12:37 #6
du har ret i at man kan bruge ScanLine i 24 bit, men jeg kan ikke lige gennemskue din pRGBArray type. Hvordan har du erklæret den?

Jeg har lavet et lille forsøg:

type
  TRGB = record
    Red,
    Green,
    Blue: Byte;
  end;

  PRGBArray = ^TRGBArray;
  TRGBArray = array[0..19] of TRGB;

procedure TForm1.Button1Click(Sender: TObject);
var
  B: TBitmap;
  PB: PRGBArray;
  i: Integer;
begin
  B := TBitmap.Create;
  try
    B.PixelFormat := pf24Bit;
    B.Width := 20;
    B.Height := 20;
    B.Canvas.Brush.Color := clWhite;
    B.Canvas.FillRect(B.Canvas.ClipRect);
    PB := PRGBArray(B.ScanLine[0]);
    for i := 0 to B.Width - 1 do
      Memo1.Lines.Add(Format(\'Red: %d, Green: %d, Blue: %d\', [PB^[i].Red, PB^[i].Green, PB^[i].Blue]));
  finally
    B.Free;
  end;
end;

det giver følgende resultat. Det ser da ok ud

Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Red: 255, Green: 255, Blue: 255
Avatar billede nico26 Nybegynder
22. august 2001 - 12:53 #7
den skal se sådan ud:

TRGB = record
  Blue,
  Green,
  Red: Byte;
end;
Avatar billede cautoo Nybegynder
22. august 2001 - 17:32 #8
det ved jeg ikk hva jeg ska med kunne du ikk bygge mit script færdigt ???? og array ser sådan her ud:

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

og den ska ikk bare tage en fra hver linie men hver enkelt pixel
Avatar billede nico26 Nybegynder
23. august 2001 - 23:19 #9
prøv det her:

unit Merge;

interface

uses
  Windows, Classes, Controls, Graphics;

type
  TRGB = record
    Blue,
    Green,
    Red: Byte;
  end;

  PRGBArray = ^TRGBArray;
  TRGBArray = array[0..10000] of TRGB;

procedure MergeBitmaps(B1, B2, B3, Dest: TBitmap;
  Width, Height: Integer; Stretch: Boolean);

implementation

uses
  SysUtils;

procedure MergeBitmaps(B1, B2, B3, Dest: TBitmap;
  Width, Height: Integer; Stretch: Boolean);

  procedure CopyBitmap(Source, Dest: TBitmap);
  begin
    Dest.Width  := Width;
    Dest.Height := Height;

    if Stretch then
      Dest.Canvas.StretchDraw(Dest.Canvas.ClipRect, Source)
    else
      Dest.Canvas.Draw(0, 0, Source);
  end;

var
  Org1, Org2, Org3: TBitmap;
  X, Y: Integer;
  O1, O2, O3, D: PRGBArray;
begin
  Org1 := TBitmap.Create;
  Org1.PixelFormat := pf24Bit;
  CopyBitmap(B1, Org1);

  Org2 := TBitmap.Create;
  Org2.PixelFormat := pf24Bit;
  CopyBitmap(B2, Org2);

  Org3 := TBitmap.Create;
  Org3.PixelFormat := pf24Bit;
  CopyBitmap(B3, Org3);

  try
    Dest.PixelFormat := pf24Bit;
    Dest.Width  := Width;
    Dest.Height := Height;

    for Y := 0 to Height - 1 do
    begin
      O1 := PRGBArray(Org1.ScanLine[Y]);
      O2 := PRGBArray(Org2.ScanLine[Y]);
      O3 := PRGBArray(Org3.ScanLine[Y]);
      D  := PRGBArray(Dest.ScanLine[Y]);

      for X := 0 to Width - 1 do
      begin
        D^[X].Red  := Round((O1^[X].Red / 255 * O3^[X].Red) +
                        (O2^[X].Red / 255 * (255 - O3^[X].Red)));
        D^[X].Green := Round((O1^[X].Green / 255 * O3^[X].Green) +
                        (O2^[X].Green / 255 * (255 - O3^[X].Green)));
        D^[X].Blue  := Round((O1^[X].Blue / 255 * O3^[X].Blue) +
                        (O2^[X].Blue / 255 * (255 - O3^[X].Blue)));
      end;
    end;
  finally
    Org1.Free;
    Org2.Free;
    Org3.Free;
  end;
end;

end.



unit Unit1;

...

implementation

{$R *.DFM}

uses
  Merge;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MergeBitmaps(Image1.Picture.Bitmap, Image2.Picture.Bitmap,
    Image3.Picture.Bitmap, Image4.Picture.Bitmap, Image1.Picture.Bitmap.Width,
    Image1.Picture.Bitmap.Height, True);
end;

end.
Avatar billede cautoo Nybegynder
24. august 2001 - 13:49 #10
image1 er resultatet
image2 er billed1
Image3 er billed2
Image4 er den der bedstemmer hvor meget af hvert billede man skal kunne se så jeg ændrede scriptkoden så den så sådan her ud:
MergeBitmaps(Image2.Picture.Bitmap,
    Image3.Picture.Bitmap, Image4.Picture.Bitmap, Image1.Picture.Bitmap, Image2.Picture.Bitmap.Width,
    Image2.Picture.Bitmap.Height, True);

men det er kun første gang jeg beder den om at ændre billedet at den gør det og når jeg har fortalt den at noget af det ska være fra det ene billede og noget fra det andet billede så vil den stadig kun vise fra det første billede :-(
Avatar billede cautoo Nybegynder
24. august 2001 - 13:50 #11
eller jo det med hva der ska vises fra hvilket billede virker men ikk det med at opdatere flere billeder
Avatar billede nico26 Nybegynder
24. august 2001 - 17:14 #12
jeg er lost! Kan du ikke definere præcist hvad koden skal lave. Min kode gør det, at den mixer B1, B2 og B3, og putter resultatet over i Dest.
Avatar billede cautoo Nybegynder
24. august 2001 - 18:33 #13
det gør den og det virker fint, men kun første gang
Avatar billede cautoo Nybegynder
24. august 2001 - 18:34 #14
alle andre gange ændrer den ikk billedet men det gamle bliver der :-(
Avatar billede nico26 Nybegynder
24. august 2001 - 22:37 #15
Det forstår jeg ikke. Hvis du kalder koden anden gang med nogle andre parametre end første gang, skulle resultatet meget gerne være anderledes.
Avatar billede cautoo Nybegynder
25. august 2001 - 17:19 #16
hele min procedure ser sådan her ud:

procedure TForm11.aktiv(tal: Integer);
var
  nyttal: Integer;
begin


try
  nyttal := (StrToInt(Form9.ListBox1.Items[tal]))-1;
  CoolWindowPopup18.indsaetbillede(nyttal);
except
  Image2.Width := Form22.SpinEdit2.Value;
  Image2.height := Form22.SpinEdit1.Value;
  Image2.canvas.Ellipse(-1,-1,Form22.SpinEdit2.Value+1,Form22.SpinEdit1.Value+1);
end;

try
  nyttal := (StrToInt(Form10.ListBox1.Items[tal]))-1;
  CoolWindowPopup24.indsaetbillede(nyttal);
except
  Image3.Width := Form22.SpinEdit2.Value;
  Image3.height := Form22.SpinEdit1.Value;
  Image3.canvas.Ellipse(-1,-1,Form22.SpinEdit2.Value+1,Form22.SpinEdit1.Value+1);
end;

try
  nyttal := (StrToInt(Form12.ListBox1.Items[tal]))-1;
  Form12.indsaetbillede(nyttal);
except
  MessageDlg(\'Der skete en fejl fordi du har rettet i noget på en forkert måde :-(\', mtError, [mbOk], 0);
end;

MergeBitmaps(Image2.Picture.Bitmap,
    Image3.Picture.Bitmap, Image4.Picture.Bitmap, Image1.Picture.Bitmap, Image2.Picture.Bitmap.Width,
    Image2.Picture.Bitmap.Height, True);

end;

de første kommandoer henter billederne!!!!
Avatar billede nico26 Nybegynder
25. august 2001 - 18:06 #17
hvad laver indsaetbillede proceduren?
kunne du evt. maile projectet til mig nico@pc.dk
Avatar billede cautoo Nybegynder
25. august 2001 - 19:29 #18
yep jeg prøver at sende det :-)
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