AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Graphics32-Frage!!

Ein Thema von bingo72 · begonnen am 25. Jul 2007 · letzter Beitrag vom 30. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#1

Graphics32-Frage!!

  Alt 25. Jul 2007, 09:23
Hallo Experten!!

Ich verwende Graphics32 mit inkludiertem Filter zum Resizen von Images nach folgenden Muster:

Delphi-Quellcode:
function TfmMain.RescalePic(aFileName: String; aPic: TImage; aCount: Integer): TBitmap;
Var
  R: TKernelResampler;
  ASrcImage: TBitMap32;
  ADstImage: TBitMap32;
  ABmp: TBitMap;
  AJPeg: TJPegImage;
  AScale: Extended;
  lPageIndex : Integer;
begin
  // Zum Abspeichern als Jpeg
  AJPeg := TJPEGImage.Create;

  // als Buffer von TImage32 zu TJpeg
  ABmp := TBitMap.Create;
  // Originalbild
  ASrcImage := TBitmap32.Create;
  // verkleinertes Bild
  ADstImage := TBitMap32.Create;

  Screen.Cursor := crHourGlass;

  try
    // Datei laden
    ASrcImage.LoadFromFile(aFileName);

    // Skalierungsfaktor (z.B. 0.5 zum Verkleinern auf 50 %
    // in diesem Beispiel wir das Bild max. 300 Pixel breit oder hoch sein
    //AScale := (300 / Max(ASrcImage.Width, ASrcImage.Height));

    // Zielbild Größe einstellen
    ADstImage.Width := 300;//Round(ASrcImage.Width * AScale);
    ADstImage.Height := 400;//Round(ASrcImage.Height * AScale);

    R := TKernelResampler.Create(ASrcImage);
    //R.Kernel := TLanczosKernel.Create;
    lPageIndex := pcMinimize.ActivePageIndex;
    R.Kernel := fFilter[aCount].Create;

    // Zielbild ist fertig
    ADstImage.Draw(ADstImage.BoundsRect, ASrcImage.BoundsRect, ASrcImage);

    // direkt geht es leider nicht in das AJpeg
    ABmp.Assign(ADstImage);

    //if AJPeg.CompressionQuality <> defJpegQuality then
      //AJPeg.CompressionQuality := defJpegQuality;

    //AJPeg.Assign(ABmp);

    aPic.Picture.Bitmap := ABmp;
    result := ABmp;

    // TDMImmoBild(DataModule).StoreImages(AJPeg);
    //AJPeg.SaveToFile('C:\Dokumente und Einstellungen\Thomas\Desktop\reklame1.jpg');

  finally
    Application.ProcessMessages;
    Screen.Cursor := crDefault;
    AJPeg.Free;
    //ABmp.Free;
    ADstImage.Free;
    ASrcImage.Free;
  end;
end;
Nun das funktioniert ja auch alles ganz schön, wenn man 32-bit-Images darstellen kann. Für meine Anwendung kann ich aber nicht immer blind davon ausgehen, daß die Graphikkarten auf Kundenrechnern 32-bit darstellen können.
Wir haben auch noch einen antiken Win95-Rechner für Testzwecke herumstehen und der meckert sobald die Draw-Methode von TBitmap32 aufgerufen wird. Auch kein Wunder, denn ein Blick auf die Bildschirmoptionen verrät, daß er nur 16- bzw. 24 bit darstellen kann.
Nun suche ich nach einer Art 'Ersatzlösung' für genau diese, wenn auch sicherlich wenige Fälle.

Daher meine Frage: Was würdet ihr für die Fälle tun, wo der Rechner keine 32-bit Farben dastellen kann??

LG
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 09:52
ich würde es generell als 24bit raus geben. Letzendlich werden ja nur 24 bit Farben und die restlichen 8 bit bestimmen einfach nur das Mischverhältnis zum Hintergrund. Also kannst du auch selbst die 24bit Farbe berechnen.

http://www.delphipraxis.net/internal...=751121#751121

Du kannst übrigens auf Draw verzichten und die Bilddaten direkt kopieren (also die BildDaten aus dem Speicher von TBitmap32 in den BildSpeicher von TBitmap kopieren)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#3

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 10:36
Hallo Thornberry!!

Klingt interessant...

Nur noch eine Frage...wie kopiere ich das Source-Image richtig?? Denn im Draw stecken ja auch die Ausmasse für das neue Image...

Habs mal so probiert...

Delphi-Quellcode:
....
    ABmp.Width := 300;//Round(ASrcImage.Width * AScale);
    ABmp.Height := 400;//Round(ASrcImage.Height * AScale);

    R := TKernelResampler.Create(ASrcImage);
    //R.Kernel := TLanczosKernel.Create;
    lPageIndex := pcMinimize.ActivePageIndex;
    R.Kernel := fFilter[aCount].Create;

    // Zielbild ist fertig
    //ADstImage.Draw(ADstImage.BoundsRect, ASrcImage.BoundsRect, ASrcImage);


    // direkt geht es leider nicht in das AJpeg
    ABmp.Assign(ASrcImage);
    .....
Aber da zeichnet er das Bild wieder in Originalgröße hin und vermutlich auch ohne Komprimierung oder??

LG
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 10:45
oh, ich glaub auch. ich seh gerade erst das der Filter wohl erst im Draw greift und das Bild nicht direkt ändert.
Dann wäre es wohl das einfachste das Bild in 24bit zu wandeln und es mit dieser Farbtiefe durch Draw zu resizen. Wird die Alphamaske bei den 32bit-Bitmaps berücksichtigt oder bleibt diese ungenutzt? Wenn sie nicht ungenutzt bleibt müsstest du diese heraustrennen, als eigenes Bild auch in der größe verändern und wieder vereinen mit dem richtigen Bild. (so hab ichs bisher gemacht weil StretchBlt die Alphamaske auch nicht berücksichtigt)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#5

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 11:18
Ich hab mich jetzt herumgespielt, wie ich denn ursprünglich ein JPEG über ein Bitmap (denn das brauch ich ja um mit PixelFormat, die Farbtiefe zu reduzieren) ein Bitmap32 bekomme....bislang ohne Erfolg...

Und NEIN, ich brauch den Alphakanal nicht....soll heissen ich rufe nirgends irgendwas mit Alphakanal eines Bildes auf...

LG
Thomas
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#6

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 13:38
Hat noch jemand eine Idee?? Ich stehe momentan ziemlich am Schlauch!!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 14:09
brauchst du das TBitmap32 nur für die Skalierung oder warum verwendest du TBitmap32 anstelle von TBitmap?
Und was ist das Eingangsformat? JPEG oder Bitmap?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#8

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 14:27
Hallo Thornberry!!

Ich brauch das Bitmap32 nur für die Skalierung, weil der Filter nur mit der TBitmap32.Draw-Methode angewendet wird.
Habe z.b. auch die StretchDraw-Methode getestet, aber das Ergebnis kannst Du vergessen, wenn in dem Bild eine Schrift oder so drinnen ist.
Das Bitmap32 hat eben eine viel größere Farbpalette zur Verfügung und kann daher auch feine Übergänge exakter darstellen.
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#9

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 14:36
Achja Eingangsformat wäre jpeg!!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Graphics32-Frage!!

  Alt 25. Jul 2007, 14:49
dann ist es ja eigentlich ganz einfach:
Delphi-Quellcode:
var
  lBmp : TBitmap;
  lJpg : TJPEGImage;
begin
  lBmp := TBitmap.Create();
  lJpg := TJPEGImage.Create();
  lJpg.LoadFromFile(FileName);
  lBmp.Assign(lBmp);
  lBmp.PixelFormat := pf24Bit;
  [...]
  ASrcImage.Assign(lBmp);
  [...]
  lJpg.Assign(ADstImage);
  lJpg.SaveToFile(FileName);
  lBmp.Free;
  lJpg.Free;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz