03. august 2002 - 12:42Der er
10 kommentarer og 1 løsning
Save to bitmap
Gemmer et panel med en opengl scene til en bitmap eller en jpeg. Det funker fint. Nu har jeg så brugt en MessageDlg til at spørge om brugeren vil overskrive billedet, hvis det findes i forvejen. Problemet er så, at der kommer et sort område, der hvor MessageDlg var på skærmen, på mit bitmap. Det hjælper ikke at gentegne hverken panel eller form. Nogen forslag, koden ser sådan ud: procedure SavePanelGLSceneToBitmap; var Bitmap : TBitmap; sFileName : string; Extension: STRING; JPEG : TJPEGImage; begin if FormMain.SavePictureDialog.Execute then begin //sFileName := ExtractFilePath(Application.ExeName) + XPROGRAM; if FileExists(FormMain.SavePictureDialog.FileName) then begin if MessageDlg('Overwrite existing file ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then Exit; end;
Extension := UpperCase(ExtractFileExt(FormMain.SavePictureDialog.FileName)); if Extension = '.JPG' then begin Bitmap := TBitmap.Create; JPEG := TJPEGImage.Create; JPEG.CompressionQuality := 80; // fairly low since artifact don't matter try Bitmap.Width := FormMain.PanelGLScene.Width; Bitmap.Height := FormMain.PanelGLScene.Height; // Copy the Panel area from the Form into a separate Bitmap Bitmap.Canvas.CopyRect(Rect(0,0, Bitmap.Width,Bitmap.Height), FormMain.Canvas, Rect(FormMain.PanelGLScene.Left, FormMain.PanelGLScene.Top, FormMain.PanelGLScene.Left + FormMain.PanelGLScene.Width-1, FormMain.PanelGLScene.Top + FormMain.PanelGLScene.Height-1) );
JPEG.Assign(Bitmap); JPEG.SaveToFile(FormMain.SavePictureDialog.FileName); finally JPEG.Free end end else // end jpeg type - if bmp type if Extension = '.BMP' then begin Bitmap := TBitmap.Create; try Bitmap.Width := FormMain.PanelGLScene.Width; //- FormMain.CoolBar1.Width; Bitmap.Height := FormMain.PanelGLScene.Height - FormMain.CoolBar1.Height; Bitmap.PixelFormat := pf24bit; // avoid palettes // Copy the Panel area from the Form into a separate Bitmap Bitmap.Canvas.CopyRect(Rect(0,0, Bitmap.Width,Bitmap.Height), FormMain.Canvas, Rect(FormMain.PanelGLScene.Left, FormMain.PanelGLScene.Top, FormMain.PanelGLScene.Left + FormMain.PanelGLScene.Width-1, FormMain.PanelGLScene.Top + FormMain.PanelGLScene.Height-1) );
Bitmap.SaveToFile(FormMain.SavePictureDialog.FileName); finally Bitmap.Free end; // end try end; // end extension end; // end SavePictureDialog.Execute end;
Du kan jo f.eks. lade være med at gemme dit "skræm bitmap" der må jo være en fatal design fejl i det PanelGLScene du bruger, den bør havde en intern buffer som er den man "tegner" i, opdatering til skærmen foregår så ved at men bare laver en copy fra buffer til skærm, og skal du have bitmap'en ud læser du fra bufferen og IKKE fra skærmen, så undgår man at få en sort firkant der hvor der har været et andet vindue.
kan du ikke få den ned i bufferen, der må som jeg sagde være et design problem med koden, det er nok det du skal løse hvis det skal ha' noget ordenlig kode når du er færdig
Tager i først omgang den nemme løsning med at flytte MessageDlg ned til lige før Bitmap.SaveToFile(FormMain.SavePictureDialog.FileName); Selv om det ikke er en smuk løsning.
Prøv at bruge en TImage til at vise dine bitmaps!!! Jeg mener jeg engang havde lign. problem og løste det ved at bruge en TImage... med mindre du insistere på at bruge en TPanel ;-))
Ellers kan du jo bare lade OpenGL vise bitmappen, så er du da helt sikker på at problemet bliver løst - lav eventuelt en polygon, hvor glDisable(gl_Lighting) påvirker polygonen og brug TBitmap'en som textur!!! - bare et foreslag
Jeg har forresten (siden jeg skrev tutorial01) udviklet en OpenGLSetup() procedure der acceptere næsten alle af Delphi's komponenter til at vise OpenGL grafik, det kan være du kan bruge den til dit projekt!!!
Bruger en skabelon fra Jan Horn (må vektoren være med ham). Men vil gerne se din OpenGLSetup() procedure. Den er vist ikke på dit site?
Synes godt om
Ny brugerNybegynder
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.