[delphi] TImage.Canvas resized niet bij TImage.Canvas.Draw

Pagina: 1
Acties:
  • 175 views sinds 30-01-2008
  • Reageer

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
Ik probeer een spelletje te maken met Delphi :) maar loop tegen een nogal moeilijk probleem aan.. Hier een voorbeeld om het probleem te laten zien en om te testen. Ik heb een Form1 met daarop een imgDisplay (type TImage) en op runtime laadt ik een plaatje in. In het voorbeeld is de code in de OnClick event gezet voor het gemak. Dan kan je klikken om te wisselen tussen het grote en het kleine plaatje. Als volgt:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.imgDisplayClick(Sender: TObject);
const
  FileBig = '640x480.jpg';
  FileSmall = '320x240.jpg';
var
  imgTemp : TImage;
  bmpBuffer : TBitmap;
begin
  { toggle big and small image }
  if (strFilename = FileSmall) then
    strFilename := FileBig
  else
    strFilename := FileSmall;

  { create image and bitmap }
  imgTemp := TImage.Create(Application);
  bmpBuffer := TBitmap.Create;
  try
    { load BMP or JPG file to temporary TImage object }
    imgTemp.Picture.LoadFromFile(strFilename);

    { convert graphic from BMP or JPG to TBitmap graphic }
    bmpBuffer.Assign(imgTemp.Picture.Graphic);

    imgDisplay.Width := bmpBuffer.Width;
    imgDisplay.Height := bmpBuffer.Height;

    imgDisplay.Canvas.Draw(0, 0, bmpBuffer);

  finally
    imgTemp.Free;
    bmpBuffer.Free;
  end;
end;

Het probleem is, dat als er eerst een klein plaatje bijv. 320x240 pixels wordt ingeladen, en daarna een groter plaatje bijv 640x480 pixels dan wordt het niet goed weergegeven. Bij het grote plaatje is dan een grijze rand te zien, er wordt slechts een gedeelte ter grootte van het kleine plaatje getoond. Blijkbaar wordt de TCanvas van de imgDisplay niet aangepast ofzo :?

Als ik als eerste het grote plaatje inlaadt en daarna de kleine, dan gaat het wel goed. Ook als daarna het grote plaatje weer wordt ingeladen..

Wat kan ik hier aan doen? imgDisplay.Canvas.Refresh of imgDisplay.Canvas.Repaint helpt iig niet.

[ Voor 4% gewijzigd door BdR op 02-06-2004 11:00 ]

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • André
  • Registratie: Maart 2002
  • Laatst online: 18-05 16:30

André

Analytics dude

Misschien gewoon de hoogte en breedte van het canvas groter maken?

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
TCanvas heeft geen Width of Height property, dat had ik ook al geprobeerd.

Maar het zou ipv aan de TCanvas misschien ook wel aan de TImage.Picture kunnen liggen :? ik weet het niet. Dus ik dacht ik doe het volgende
Delphi:
1
2
  imgDisplay.Picture.Width := bmpBuffer.Width;
  imgDisplay.Picture.Height := bmpBuffer.Height;

maar Picture.Width en Height zijn blijkbaar 'read-only properties', die mag je niet zo rechtstreeks wijzigen.

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17:56

Creepy

Tactical Espionage Splatterer

Een picture heeft o.a. een bitmap property waarvan je wel de width en height van kan zetten.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
Creepy schreef op 02 juni 2004 @ 11:24:
Een picture heeft o.a. een bitmap property waarvan je wel de width en height van kan zetten.
Delphi:
1
2
  imgDisplay.Picture.Bitmap.Width := bmpBuffer.Width;
  imgDisplay.Picture.Bitmap.Height := bmpBuffer.Height;

dat is em _/-\o_ senk joe!

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Je kunt ook de AutoSize property van de Image waar het plaatje op moet komen op 'True' zetten en het plaatje direct inladen.

Developer Accused Of Unreadable Code Refuses To Comment


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
@Icelus: Klopt, maar als ik de AutoSize op True zet laat hij helemaal niet meer zien :? En als ik een JPG direct inlaadt (met imgDisplay.Picture.LoadFromFile) dan wordt het wel direct goed weergegeven, maar dan kan ik vervolgens de TCanvas niet meer bewerken met CopyRect enzo, en dat is juist nodig voor dat spelletje.

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17:56

Creepy

Tactical Espionage Splatterer

BdR schreef op 02 juni 2004 @ 11:40:
@Icelus: Klopt, maar als ik de AutoSize op True zet laat hij helemaal niet meer zien :? En als ik een JPG direct inlaadt (met imgDisplay.Picture.LoadFromFile) dan wordt het wel direct goed weergegeven, maar dan kan ik vervolgens de TCanvas niet meer bewerken met CopyRect enzo, en dat is juist nodig voor dat spelletje.
Let me guess, een "bitmap needed" o.i.d error (ben de preciese error even kwijt, en geen Delpi bij de hand).

Als je een JPEG in een TPicture laadt, dan wordt de picture.bitmap standaard NIET gebruikt. Er is een optie in TPicture om de jpeg geforceerd om te laten zetten naar een bitmap zodat je weer rustig aan de slag kan met je canvas en picture.bitmap.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1