home *** CD-ROM | disk | FTP | other *** search
- unit walkunit;
-
- // ─nderungen:
- // 06.04.99: durch einen Doppelklick auf das Label mit dem Zieldateinamen kann
- // eine andere Datei gewΣhlt werden, statt wie bisher nur ⁿber die
- // Ini-Datei
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- FileCtrl, StdCtrls, Buttons, Grids, Outline, DirOutln, ExtCtrls;
-
- type
- TImgInfo = record
- iWidth, iHeight: integer;
- tWidth, tHeight: integer;
- sLinkName: string;
- sThumbName: string;
- end;
-
- type
- TForm1 = class(TForm)
- btnGenerate: TBitBtn;
- DriveComboBox1: TDriveComboBox;
- DirectoryListBox1: TDirectoryListBox;
- FileListBox1: TFileListBox;
- btnExit: TBitBtn;
- Label1: TLabel;
- Label2: TLabel;
- cbDoThumbs: TCheckBox;
- Label3: TLabel;
- Image1: TImage;
- cbConvert2JPEG: TCheckBox;
- cbIncludeBMP: TCheckBox;
- cbUseRelativePath: TCheckBox;
- GroupBox1: TGroupBox;
- SpeedButton1: TSpeedButton;
- Label4: TLabel;
- Label5: TLabel;
- SaveDialog1: TSaveDialog;
- procedure btnExitClick(Sender: TObject);
- procedure btnGenerateClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure SpeedButton1Click(Sender: TObject);
- procedure Label5DblClick(Sender: TObject);
- private
- { Private-Deklarationen }
- public
- { Public-Deklarationen }
- TemplatePfad: string;
- procedure CreateImageHtml (const DirName: string);
- function ConvertBMP2JPEG (const FName: string): integer;
- function ProcessImage (const DirName: string; var BigImageName: string): TImgInfo;
- function ReadSettings: integer;
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
-
- // ToDo-Liste:
- // (1) Erzeugen von Thumbnails
- // (2) Progress Indicator
- // (3) Funktion KeepWindowsAlive wΣhrend der BMP->JPEG Konvertierung
- // (4) Header/Footer-Dateien einbinden
-
- uses IniFiles, Consts, GIFImage, JPEG;
-
- const
- ThumbDir: string = 'Thumb';
- ThumbPrefix: string = 't_';
- ImagesHTML: string = 'images.htm';
- MaxThumbSize: integer = 300;
- TemplatePath: string = '';
- HeaderName: string = 'htest.htm';
- FooterName: string = 'ftest.htm';
-
- procedure FileCopy (SourceName, TargetName: string);
- var
- SourceFile, TargetFile: System.Text;
- Line: string;
- begin
- if FileExists (SourceName) then begin
- AssignFile (SourceFile, SourceName);
- AssignFile (TargetFile, TargetName);
- Reset (SourceFile);
- Rewrite (TargetFile);
- while (not eof(SourceFile)) do begin
- ReadLn (SourceFile, Line);
- WriteLn (TargetFile, Line);
- end;
- CloseFile (SourceFile);
- CloseFile (TargetFile);
- end;
- end;
-
- procedure FileAdd (SourceName, TargetName: string);
- var
- SourceFile, TargetFile: System.Text;
- Line: string;
- begin
- if FileExists (SourceName) then begin
- AssignFile (SourceFile, SourceName);
- AssignFile (TargetFile, TargetName);
- Reset (SourceFile);
- Append (TargetFile);
- while (not eof(SourceFile)) do begin
- ReadLn (SourceFile, Line);
- WriteLn (TargetFile, Line);
- end;
- CloseFile (SourceFile);
- CloseFile (TargetFile);
- end;
- end;
-
- function GetFileSize (const FName: string): integer;
- var
- SearchRec: TSearchRec;
- begin
- if FindFirst (FName, faAnyFile, SearchRec) = 0 then begin
- Result := SearchRec.Size;
- end else Result := 0;
- FindClose (SearchRec);
- end;
-
- // herausgel÷st aus der Datei fmxutils.pas aus dem Beispielprogrammen
- // ─nderung: keine Prⁿfung mehr, ob die Zieldatei ein Verzeichnis ist!
- procedure CopyAFile(const FileName, DestName: TFileName);
- var
- CopyBuffer: Pointer; { buffer for copying }
- BytesCopied: Longint;
- Source, Dest: Integer; { handles }
- Destination: TFileName; { holder for expanded destination name }
- const
- ChunkSize: Longint = 8192; { copy in 8K chunks }
- begin
- Destination := ExpandFileName(DestName); { expand the destination path }
- (*
- if HasAttr(Destination, faDirectory) then { if destination is a directory... }
- Destination := Destination + '\' + ExtractFileName(FileName); { ...clone file name }
- *)
- GetMem(CopyBuffer, ChunkSize); { allocate the buffer }
- try
- Source := FileOpen(FileName, fmShareDenyWrite); { open source file }
- if Source < 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]);
- try
- Dest := FileCreate(Destination); { create output file; overwrite existing }
- if Dest < 0 then raise EFCreateError.CreateFmt(SFCreateError, [Destination]);
- try
- repeat
- BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }
- if BytesCopied > 0 then { if we read anything... }
- FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }
- until BytesCopied < ChunkSize; { until we run out of chunks }
- finally
- FileClose(Dest); { close the destination file }
- end;
- finally
- FileClose(Source); { close the source file }
- end;
- finally
- FreeMem(CopyBuffer, ChunkSize); { free the buffer }
- end;
- end;
-
- //==============================================================================
-
- function TForm1.ReadSettings: integer;
- var
- IniName: string;
- IniFile: TIniFile;
- begin
- IniName := ChangeFileExt (Application.ExeName, '.ini');
- if FileExists (IniName) then begin
- IniFile := TIniFile.Create (IniName);
- ThumbDir := IniFile.ReadString ('ImageWalker', 'ThumbDir', ThumbDir);
- ThumbPrefix := IniFile.ReadString ('ImageWalker', 'ThumbPrefix', ThumbPrefix);
- ImagesHTML := IniFile.ReadString ('ImageWalker', 'HTMLFile', ImagesHTML);
- MaxThumbSize := IniFile.ReadInteger ('ImageWalker', 'MaxThumbSize', MaxThumbSize);
- TemplatePath := IniFile.ReadString ('ImageWalker', 'TemplatePfad', TemplatePath);
- HeaderName := IniFile.ReadString ('ImageWalker', 'Header', 'htest.htm');
- FooterName := IniFile.ReadString ('ImageWalker', 'Footer', 'ftest.htm');
- IniFile.Free;
- Label5.Caption := ImagesHTML;
- Result := 0;
- end else Result := -1;
- end;
-
- function TForm1.ConvertBMP2JPEG (const FName: string): integer;
- var
- MyJPEG: TJPEGImage;
- MyBMP: TBitmap;
- begin
- MyBMP := TBitmap.Create;
- try
- MyBMP.LoadFromFile (FName);
- MyJPEG := TJPEGImage.Create;
- MyJPEG.Assign (MyBMP);
- // Windows Messageloop aufrufen
- Application.ProcessMessages;
- MyJPEG.SaveToFile (ChangeFileExt(FName, '.jpg'));
- MyJPEG.Free;
- finally
- MyBMP.Free;
- end;
- end;
-
- function Need2Resize (const x,y: integer): boolean;
- begin
- if ((x < MaxThumbSize) and (y < MaxThumbSize))
- then Result := false
- else Result := true;
- end;
-
- // allgemeingⁿltige Gr÷▀enbestimmung fⁿr die Bitmaps
- // die Abmessungen werden solange verkleinert, bis Schwellenwert unterschritten
- procedure NewSize (var x,y: integer);
- begin
- repeat
- // Halbierung der Werte pro Durchlauf
- // x := x div 2;
- // y := y div 2;
- // alternativ: Reduzierung um "Wurzel-2"
- x := trunc(x / sqrt(2.0));
- y := trunc(y / sqrt(2.0));
- until ((x <= MaxThumbSize) and (y <= MaxThumbSize));
- end;
-
- function TForm1.ProcessImage (const DirName: string; var BigImageName: string): TImgInfo;
- var
- w, h: integer;
- ext, ThumbName: string;
- TmpPath: string;
- tmpResult: TImgInfo;
- bmp, bmp0: TBitmap;
- gif, gif0: TGifImage;
- jpg, jpg0: TJPEGImage;
- begin
- Label2.Caption := ExtractFileName (BigImageName);
- Label2.Refresh;
-
- ext := lowercase(ExtractFileExt (BigImageName));
- Image1.Picture.Assign (NIL);
- Image1.Picture.LoadFromFile (BigImageName);
- Image1.Refresh;
- w := Image1.Picture.Width;
- h := Image1.Picture.Height;
- tmpResult.iWidth := w;
- tmpResult.iHeight := h;
-
- if (ext = '.bmp') then begin
- if cbConvert2JPEG.Checked then begin
- ConvertBMP2JPEG (BigImageName);
- tmpResult.sLinkName := ChangeFileExt (BigImageName, '.jpg');
- end else tmpResult.sLinkName := BigImageName;
- if cbDoThumbs.Checked then begin
- // Thumbnail als JPEG erzeugen
- bmp := TBitmap.Create;
- if Need2Resize (w, h) then begin
- NewSize (w, h);
- bmp.Width := w;
- bmp.Height := h;
- bmp.Canvas.StretchDraw (Rect(0,0, bmp.Width, bmp.Height),
- Image1.Picture.Bitmap);
- end else begin
- bmp.Width := w;
- bmp.Height := h;
- bmp.Canvas.Draw (0, 0, Image1.Picture.Bitmap);
- end;
- jpg := TJPEGImage.Create;
- jpg.Assign (bmp);
- ThumbName := ThumbDir + '\' + ChangeFileExt(ThumbPrefix + BigImageName, '.jpg');
- jpg.SaveToFile (ThumbName);
- jpg.Free;
- bmp.Free;
- tmpResult.tWidth := w;
- tmpResult.tHeight := h;
- tmpResult.sThumbName := ThumbName;
- end;
- end;
-
- if ((ext = '.gif') and cbDoThumbs.Checked) then begin
- // der aktuelle Weg ist noch ein bi▀chen "von hinten durch die Brust" !!
- if Need2Resize (w, h) then begin
- gif0 := TGifImage.Create;
- gif0.LoadFromFile (BigImageName);
- bmp0 := TBitmap.Create;
- bmp0.Assign (gif0);
- bmp := TBitmap.Create;
- NewSize (w, h);
- bmp.Width := w;
- bmp.Height := h;
- bmp.Canvas.StretchDraw (Rect(0,0, bmp.Width, bmp.Height), bmp0);
- gif0.Free;
- bmp0.Free;
- gif := TGifImage.Create;
- gif.Assign (bmp);
- ThumbName := ThumbDir + '\' + ThumbPrefix + BigImageName;
- gif.SaveToFile (ThumbName);
- gif.Free;
- bmp.Free;
- end else CopyAFile (BigImageName, ThumbDir + '\' + ThumbPrefix + BigImageName);
- tmpResult.tWidth := w;
- tmpResult.tHeight := h;
- tmpResult.sThumbName := ThumbDir + '\' + ThumbPrefix + BigImageName;
- tmpResult.sLinkName := BigImageName;
- end;
-
- if ((ext = '.jpg') and cbDoThumbs.Checked) then begin
- if Need2Resize (w, h) then begin
- jpg0 := TJpegImage.Create;
- jpg0.LoadFromFile (BigImageName);
- bmp0 := TBitmap.Create;
- bmp0.Assign (jpg0);
- bmp := TBitmap.Create;
- NewSize (w, h);
- bmp.Width := w;
- bmp.Height := h;
- bmp.Canvas.StretchDraw (Rect(0,0, bmp.Width, bmp.Height), bmp0);
- jpg0.Free;
- bmp0.Free;
- jpg := TJpegImage.Create;
- jpg.Assign (bmp);
- ThumbName := ThumbDir + '\' + ThumbPrefix + BigImageName;
- jpg.SaveToFile (ThumbName);
- jpg.Free;
- bmp.Free;
- end else CopyAFile (BigImageName, ThumbDir + '\t_' + BigImageName);
- tmpResult.tWidth := w;
- tmpResult.tHeight := h;
- tmpResult.sThumbName := ThumbDir + '\' + ThumbPrefix + BigImageName;
- tmpResult.sLinkName := BigImageName;
- end;
-
- Result := tmpResult;
- end;
-
- procedure TForm1.CreateImageHtml (const DirName: string);
- var
- HTMLName: string;
- ImageName: string;
- ThumbName: string;
- HTMLFile: TextFile;
- i: integer;
- x: TImgInfo;
- IORes: integer;
- begin
- HTMLName := DirName + '\' + ImagesHTML;
-
- AssignFile (HTMLFile, HTMLName);
- Rewrite (HTMLFile);
- WriteLn (HTMLFile, '<!-- ImageWalker v0.9 -->');
- CloseFile (HTMLFile);
- // Headerdatei einlesen und in HTML-Datei schreiben
- FileAdd (TemplatePath + HeaderName, HTMLName);
- Append (HTMLFile);
- // wenn Thumbs erzeugt werden sollen, ggf. Thumbverzeichnis generieren
- // dabei prⁿfen, ob bereits ein Verzeichnis mit diesem Namen existiert
- if cbDoThumbs.Checked then begin
- {$I-}
- MkDir (ThumbDir);
- {$I+}
- IORes := IOResult;
- if (IORes <> 0)
- then begin
- if (IORes = 183)
- then Label3.Caption := 'Verzeichnis ' + ThumbDir + ' existiert bereits'
- else Label3.Caption := 'Verzeichnis ' + ThumbDir + ' konnte nicht angelegt werden'
- end else Label3.Caption := 'Verzeichnis ' + ThumbDir + ' erzeugt';
- Label3.Refresh;
- end;
-
- // HTML SubHeader erzeugen
- WriteLn (HTMLFile, '<h2>Verzeichnis: ' + DirName + '</h2><p>');
- WriteLn (HTMLFile, 'enthΣlt ' + IntToStr(FileListbox1.Items.Count) + ' Dateien<p>');
- WriteLn (HTMLFile, 'erstellt am: ' + FormatDateTime('dd.mm.yyyy hh:mm:ss', Now));
- WriteLn (HTMLFile, '<table border="4">');
- WriteLn (HTMLFile, '<tr><th>Dateiname</th><th>Gr÷▀e</th><th>Bild</th></tr>');
-
- Screen.Cursor := crHourglass;
- try
- // einzelne Bilder bearbeiten
- for i := 0 to FileListbox1.Items.Count-1 do begin
- ImageName := FileListbox1.Items[i];
- x := ProcessImage (DirName, ImageName);
- Application.ProcessMessages;
- ThumbName := x.sThumbName;
- WriteLn (HTMLFile, '<tr>');
- WriteLn (HTMLFile, ' <td>' + ImageName + '</td>');
- Write (HTMLFile, ' <td>');
- Write (HTMLFile, IntToStr(GetFileSize(DirName + '\' + ImageName)) + ' Bytes<br>');
- Write (HTMLFile, IntToStr(x.iWidth) + ' x ' + IntToStr(x.iHeight)+ ' Pixel');
- WriteLn (HTMLFile, '</td>');
- Write (HTMLFile, ' <td>');
- // Link erzeugen, da▀ bei Klick auf Thumbnail das Originalbild angezeigt wird
- Write (HTMLFile, '<a href="' + x.sLinkName + '">');
- Write (HTMLFile, '<img align="top" width="' + IntToStr(x.tWidth) + '" height="');
- Write (HTMLFile, IntToStr(x.tHeight) + '" src="'+ x.sThumbName + '">');
- Write (HTMLFile, '</a>');
- WriteLn (HTMLFile, '</td>');
- WriteLn (HTMLFile, '</tr>');
- end;
- finally
- Screen.Cursor := crDefault;
- end;
-
- // HTML-Tabelle abschlie▀en
- WriteLn (HTMLFile, '</table>');
- WriteLn (HTMLFile, '<p>');
- WriteLn (HTMLFile, 'generiert von ImageWalker');
-
- // Zieldatei schlie▀en, damit FileAdd erfolgreich sein kann
- CloseFile (HTMLFile);
- // Footerdatei einlesen und in HTML-Datei schreiben
- FileAdd (TemplatePath + FooterName, HTMLName);
- Label3.Caption := 'Arbeitsablauf beendet';
- Label3.Refresh;
- end;
-
- procedure TForm1.btnExitClick(Sender: TObject);
- begin
- Close;
- end;
-
- procedure TForm1.btnGenerateClick(Sender: TObject);
- begin
- // Datei mit dem Namen ImagesHTML generieren
- CreateImageHtml (DirectoryListbox1.Directory);
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- ReadSettings;
- end;
-
-
- procedure TForm1.SpeedButton1Click(Sender: TObject);
- begin
- ShowMessage ('ImageWalker v1.01 vom 06.04.1999' + #13#10 +
- '(c) 1999 Andreas Golgath fⁿr die PC Professionell' + #13#10 +
- 'Software und Quelltext dⁿrfen frei verwendet werden' + #13#10 +
- #13#10 +
- 'This software is based, in part, on the work of Anders Melander');
- end;
-
- procedure TForm1.Label5DblClick(Sender: TObject);
- begin
- if (SaveDialog1.Execute) then begin
- ImagesHTML := SaveDialog1.Filename;
- Label5.Caption := ImagesHTML;
- end;
- end;
-
- end.
-