AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia TIF-Datei in einzelne Bitmap zerlegen

TIF-Datei in einzelne Bitmap zerlegen

Ein Thema von WIKINGFR · begonnen am 17. Dez 2011 · letzter Beitrag vom 17. Dez 2011
Antwort Antwort
WIKINGFR

Registriert seit: 16. Apr 2007
2 Beiträge
 
Delphi XE Starter
 
#1

TIF-Datei in einzelne Bitmap zerlegen

  Alt 17. Dez 2011, 00:00
Hallo,

ich möchte eine TIF-Datei mit mehreren Seiten in einzelne BMP-Dateien pro Seite zerlegen, um dann mit diesen weiterzuarbeiten.
Die für die Verarbeitung von TIF-Dateien immer wieder empfohlene GraphicEx hilft mir scheinbar nicht weiter,
ich erhalte nach dem einfachen Einbinden beim Compilieren der Anwendung Fehlermeldungen die sich auf diese Unit beziehen.

Mein Versuch ging erstmal in diese Richtung,
wobei der Container ein TFrame mit daraufgesetzten TImage ist.
Delphi-Quellcode:
{ TIF-Datei zerlegen }
procedure TFormular.TIFZerlegen(const Dateiname: TFileName);
var
  objImage: TWICImage;
begin
  { Grafik-Objekt erzeugen }
  objImage := TWICImage.Create;
  { Fehlerbehandlung }
  try
    objImage.LoadFromFile(Dateiname);
    { Format prüfen }
    if objImage.ImageFormat = wifTiff then
    begin
      { Bild zuweisen und speichern }
      Container.Image.Width := objImage.Width;
      Container.Image.Height := objImage.Height;
      Container.Image.Picture.Bitmap.Width := objImage.Width;
      Container.Image.Picture.Bitmap.Height := objImage.Height;
      Container.Image.Picture.Bitmap.Assign(objImage);
      Container.Image.Picture.Bitmap.SaveToFile(Dateiname + '_TBitmap.bmp');
      { Direkt als BMP speichern }
      objImage.ImageFormat := wifBmp;
      objImage.SaveToFile(Dateiname + '_TWICImage.bmp');
    end; { if then }
  finally
    { Grafik-Objekt freigeben }
    objImage.Free;
  end; { try finally }
end; { TFormular.TIFZerlegen }
Es wird im TImage aber immer nur die erste Seite der TIF-Datei angezeigt und auch gespeichert.
Aber damit komme ich nicht weiter, weil hier ja offensichtlich ein Bezug auf die Seite fehlt.

Wie kann ich die einzelnen Seiten der TIF-Datei durchlaufen und als Bitmap speichern?

Ich hoffe es gibt eine einfache Lösung.
Denn selbst in der Windows-Fotogalerie kann man TIF-Dateien anzeigen und durchblättern,
aber wenn man z.B. auf der zweiten Seiten einen Rechtsklick + Kopieren macht wird auch nur die Grafik der ersten Seite in die Zwischenablage kopiert.

Grüße Frank
Frank
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.977 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TIF-Datei in einzelne Bitmap zerlegen

  Alt 17. Dez 2011, 00:17
Wenn die verwendete TIFF-Komponente nur das erste Bild ausliest und für den Rest nichts implementiert wurde, dann kannst du da nichts machen.

Lösung: Eine andere Komponente verwenden, welche das kann.
z.B. ImageEn
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (17. Dez 2011 um 00:21 Uhr)
  Mit Zitat antworten Zitat
WIKINGFR

Registriert seit: 16. Apr 2007
2 Beiträge
 
Delphi XE Starter
 
#3

AW: TIF-Datei in einzelne Bitmap zerlegen

  Alt 17. Dez 2011, 17:39
Hallo,

ich glaube ImageEn ist etwas zu viel für mich.

Ich habe jetzt versucht mit der LibTiffDelphi das Problem zu lösen.
Die erste Seite der TIF-Datei wird wieder wunderbar gespeichert.
Delphi-Quellcode:
procedure TFormular.TIFZerlegen(const Dateiname: TFileName);
var
  objTIFFImage: PTIFF;
  objBMPImage: TBitmap;
  intWidth: Integer;
  intHeight: Integer;
  intSeiten: Integer;
begin
  { Datei öffnen }
  objTIFFImage := TIFFOpen(Dateiname,'r');
  { Anzahl der Seiten ermitteln }

  { Größe der Seite ermitteln }
  TIFFGetField(objTIFFImage, TIFFTAG_IMAGEWIDTH, @intWidth);
  TIFFGetField(objTIFFImage, TIFFTAG_IMAGELENGTH, @intHeight);
  { Bitmap erzeugen }
  objBMPImage := TBitmap.Create;
  { Fehlerbehandlung }
  try
    { Inhalt dem Bitmap zuweisen }
    objBMPImage.Width := intWidth;
    objBMPImage.Height := intHeight;
    TIFFReadRGBAImage(objTIFFImage, intWidth, intHeight, objBMPImage.Scanline[intHeight - 1], 0);
    { Bitmap speichern }
    objBMPImage.SaveToFile(Dateiname + '_TIFFImage.bmp');
  except
    { Bitmap freigeben }
    objBMPImage.Free;
  end; { trx except }
  { Datei schließen }
  TIFFClose(objTIFFImage);
end; { TFormular.TIFZerlegen }
Ich finde aber einfach keine Eigenschaft zur Anzahl der Seiten um z.B. eine Schleife zu erstellen.
Mir ist auch nicht klar wie man die einzelnen Seiten aus der TIF lesen kann.

Gruß Frank
Frank
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf