Tech-Ecke / Delphi Inhalt / TImage / TBitmap

 

     TImage / TBitmap

 


   Laden uns speichern von Bitmaps

   Image1.Picture.LoadFromFile('C:\bild.bmp');  // Bild laden
 
   Image1.Picture.SaveToFile('C:\bild.bmp');  // Bild speichern
 


   Bild löschen

   Image1.Picture := nil; // Bild löschen
 


   Zuweisen eines TBitmaps
 (var Bild: TBitmap;)

  Bild:=TBitmap.create;
try
   Bild.LoadFromFile('C:\bild.bmp');  // lädt das Bitmap Bild ins TBitmap Bild
finally
   Image1.Picture.Assign(Bild);  // hier wird das Bitmap (Inhalt von TBitmap) zugewiesen
   Bild.Free;
end;
 


   Bild verkleinern bzw, vergrößern

Um die Größe eines Bitmap zu ändern (Resizen) gibt es die Methode Canvas.StretchDraw, jedoch liefert diese nur ein bescheidenes Ergebnis. Das Bild ist ziemlich verpixelt. Wesentlich bessere Ergebnisse bekommt man mit der Methode "Stretch", der Grafikbibliothek GraphicEX. Diese kann hier heruntergeladen werden. GraphicEx muss nicht zwingend als Komponente installiert werden, es reicht die Angabe zur GraphicEx.pas. Mehr Infos zum Installieren einer Komponente gibt es hier.

   Stretch(75, 50, sfLanczos3, 0, Image1.Picture.Bitmap);  // benötigt GraphicEx in Uses !
 

Neben der Resemblermethode Lanczos3, stehen noch weitere Methoden zur Verfügung (sfBox, sfTriangle, sfHermite, sfBell, sfSpline, und sfMitchell), jedoch liefert Lanczos3 die besten Ergebnisse, wobei diese auch die langsamste Methode ist.

Hier mal ein Unterschied von StretchDraw zu GraphicEx Stretch mit Lanczos3 Resemblermethode:
 

Original Größe StrechDraw GraphicEx Stretch - sfLanczos3


   Bild in Graustufen umwandeln

  procedure GrayScale(C:TCanvas);
var x, y: integer;
  Color: LongInt;
  R, G, B, Gr: Byte;
begin
  with C do begin
    for x:= ClipRect.Left to ClipRect.Right do
      for y:= ClipRect.Top to ClipRect.bottom do
      begin
        Color := ColorToRGB(Pixels[x,Y]);

        R := GetRValue(Color);
        G := GetGValue(Color);
        B := GetBValue(Color);

        Gr:= Trunc(B*0.11+G*0.59+R*0.3);
        Pixels[x,Y] := RGB(Gr, Gr, Gr);
      end;
  end;
end;
 

Angewendet wird das ganze auf das Canves:

  image1.Picture.bitmap.PixelFormat := pf24bit;
GrayScale(Image1.Picture.Bitmap.Canvas);
 


 

   Helligkeit ändern

  procedure Helligkeit(Bitmap, // Zielbitmap
                       Original : TBitmap; // Quellbitmap - Ziel und Quelle kann gleich sein
                       Value : integer); // Wert zw -240 ... + 240
var x,y : integer;
    Ziel : ^TRGBTriple;
    Quelle : ^TRGBTriple;
    n : byte;
    ar : array[0..255] of byte;
begin

  n := abs(value);
  if value > 0 then
    for x := 0 to 255 do if integer(x + n) > 255 then ar[x] := 255 else ar[x] := x + n
  else
    for
x := 0 to 255 do if integer(x - n) < 0 then ar[x] := 0 else ar[x] := x - n;

  for y := 0 to Bitmap.Height-1 do begin
     Ziel := Bitmap.Scanline[y];
     Quelle := Original.Scanline[y];
     for x := 0 to (Bitmap.Width-1) do begin
       Ziel^.rgbtBlue := ar[Quelle^.rgbtBlue];
       Ziel^.rgbtred := ar[Quelle^.rgbtred];
       Ziel^.rgbtGreen := ar[Quelle^.rgbtGreen];
       inc(Ziel);
       inc(quelle);
     end;
  end;
end;
 

Quelle: http://www.delphipraxis.net

Aufgerufen wir die Prozedur so:

  image1.Picture.bitmap.PixelFormat := pf24bit;
Helligkeit(image1.picture.bitmap, image1.picture.bitmap, 50);
image1.repaint
 


 

   Animierte Gif's in TImage (ab D2007)

  GIFImageDefaultAnimate := True; // Benötigt GIFImg in Uses.

Image1.Picture.LoadFromFile('C:\image.gif');
 

Möchte man ein animiertes Gif aus der Resource laden:

  var
   TempGif: TGifImage;
   ResStream: TResourceStream;

.
.
.


GIFImageDefaultAnimate := True;
try
   ResStream := TResourceStream.Create(HInstance, 'image', RT_RCDATA);
   TempGif := TGifImage.Create;
   TempGif.LoadFromStream(ResStream);
   Image1.Picture.Assign(TempGif);
finally
   FreeAndNil(ResStream);
   FreeAndNil(TempGif);
end;
 

"Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !"

[letzte Aktualisierung 20.12.2015]