Sfoglia il codice sorgente

FIX: Viewer - save image as (save jpeg as new jpeg, save image with upper case extension)

Alexander Koblov 2 anni fa
parent
commit
22f40b4864
4 ha cambiato i file con 108 aggiunte e 255 eliminazioni
  1. 27 115
      src/fmodview.lfm
  2. 2 8
      src/fmodview.lrj
  3. 15 76
      src/fmodview.pas
  4. 64 56
      src/fviewer.pas

+ 27 - 115
src/fmodview.lfm

@@ -15,7 +15,7 @@ object frmModView: TfrmModView
   OnKeyPress = FormKeyPress
   OnShow = FormShow
   Position = poOwnerFormCenter
-  LCLVersion = '1.6.0.3'
+  LCLVersion = '2.2.6.0'
   object bplButtons: TButtonPanel
     Left = 10
     Height = 34
@@ -59,14 +59,17 @@ object frmModView: TfrmModView
       ClientWidth = 468
       TabOrder = 2
       object tbQuality: TTrackBar
+        AnchorSideTop.Control = lblQuality
+        AnchorSideTop.Side = asrBottom
         Left = 0
         Height = 22
         Top = 71
         Width = 140
         Max = 100
         Min = 1
+        OnChange = tbQualityChange
         Position = 80
-        OnMouseMove = tbQualityMouseMove
+        BorderSpacing.Top = 12
         TabOrder = 0
       end
       object lblQuality: TLabel
@@ -78,62 +81,18 @@ object frmModView: TfrmModView
         Enabled = False
         ParentColor = False
       end
-      object teQuality: TEdit
+      object teQuality: TSpinEdit
+        AnchorSideTop.Control = tbQuality
+        AnchorSideTop.Side = asrCenter
         Left = 144
-        Height = 23
-        Top = 71
-        Width = 43
-        OnKeyPress = teQualityKeyPress
-        OnKeyUp = teQualityKeyUp
+        Height = 36
+        Top = 38
+        Width = 75
+        MaxValue = 100
+        MinValue = 1
+        OnChange = teQualityChange
         TabOrder = 1
-        Text = '80'
-      end
-      object rbJpg: TRadioButton
-        Left = 8
-        Height = 19
-        Top = 0
-        Width = 39
-        Caption = 'JPG'
-        Checked = True
-        OnChange = rbJpgChange
-        TabOrder = 2
-        TabStop = True
-      end
-      object rbBmp: TRadioButton
-        Left = 59
-        Height = 19
-        Top = 0
-        Width = 45
-        Caption = 'BMP'
-        OnChange = rbBmpChange
-        TabOrder = 3
-      end
-      object rbPng: TRadioButton
-        Left = 112
-        Height = 19
-        Top = 0
-        Width = 44
-        Caption = 'PNG'
-        OnChange = rbPngChange
-        TabOrder = 4
-      end
-      object rbIco: TRadioButton
-        Left = 29
-        Height = 19
-        Top = 22
-        Width = 40
-        Caption = 'ICO'
-        OnChange = rbIcoChange
-        TabOrder = 5
-      end
-      object rbPnm: TRadioButton
-        Left = 88
-        Height = 19
-        Top = 21
-        Width = 47
-        Caption = 'PNM'
-        OnChange = rbPnmChange
-        TabOrder = 6
+        Value = 1
       end
     end
     object pnlCopyMoveFile: TPanel
@@ -514,70 +473,23 @@ object frmModView: TfrmModView
     end
   end
   object sddCopyMoveFile: TSelectDirectoryDialog
-    left = 288
-    top = 40
+    Left = 288
+    Top = 40
   end
   object ImageList: TImageList
     Height = 24
     Width = 9
-    left = 288
-    top = 112
+    Left = 288
+    Top = 112
     Bitmap = {
-      4C69020000000900000018000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000535755565357
-      55FF535755FF535755FF535755FF535755FF5357555600000000000000005357
-      55FF8E8D8DFFE9E8E8FFE9E8E8FFE9E8E8FF908E8EFF535755FF000000000000
-      0000535755FFE9E8E8FF535755FF535755FF535755FFE9E8E8FF535755FF0000
-      000000000000535755FFE9E8E8FF535755FF53575500535755FFE9E8E8FF5357
-      55FF0000000000000000535755FFE9E8E8FF535755FF00000000535755FFE9E8
-      E8FF535755FF0000000000000000535755FFE9E8E8FF535755FF000000005357
-      55FFE9E8E8FF535755FF0000000000000000535755FFE9E8E8FF535755FF858A
-      88FF535755FFE9E8E8FF535755FF0000000000000000535755FF918F8FFF3634
-      2EFFECEEEEFF858A88FF918F8FFF535755FF0000000000000000535755445357
-      55FF36342EFFECEEEEFF858A88FF535755FF5357555600000000000000000000
-      00000000000036342EFFECEEEEFF858A88FF0000000000000000000000000000
-      0000000000000000000036342EFFECEEEEFF858A88FF00000000000000000000
-      00000000000053575544535755FF36342EFFECEEEEFF858A88FF535755FF5357
-      55440000000000000000535755FF999898FF36342EFFECEEEEFF858A88FF9795
-      95FF535755FF0000000000000000535755FFE9E8E8FF535755FF36342EFF5357
-      55FFE9E8E8FF535755FF0000000000000000535755FFE9E8E8FF535755FF0000
-      0000535755FFE9E8E8FF535755FF0000000000000000535755FFE9E8E8FF5357
-      55FF00000000535755FFE9E8E8FF535755FF0000000000000000535755FFE9E8
-      E8FF535755FF00000000535755FFE9E8E8FF535755FF00000000000000005357
-      55FFE9E8E8FF535755FF535755FF535755FFE9E8E8FF535755FF000000000000
-      0000535755FF9E9D9DFFE9E8E8FFE9E8E8FFE9E8E8FFBAB9B9FF535755FF0000
-      00005357550053575556535755FF535755FF535755FF535755FF535755FF5357
-      5556000000000000000000000000000000000000000000000000000000000000
-      0000535755000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000053575556535755FF535755FF5357
-      55FF535755FF535755FF535755560000000000000000535755FF8E8D8DFFE9E8
-      E8FFE9E8E8FFE9E8E8FF908E8EFF535755FF0000000000000000535755FFE9E8
-      E8FF535755FF535755FF535755FFE9E8E8FF535755FF00000000000000005357
-      55FFE9E8E8FF535755FFE9E8E800535755FFE9E8E8FF535755FF000000000000
-      0000535755FFE9E8E8FF535755FF53575500535755FFE9E8E8FF535755FF0000
-      000000000000535755FFE9E8E8FF535755FF53575500535755FFE9E8E8FF5357
-      55FF0000000000000000535755FFE9E8E8FF535755FF858A88FF535755FFE9E8
-      E8FF535755FF0000000000000000535755FF918F8FFF36342EFFECEEEEFF858A
-      88FF918F8FFF535755FF000000000000000053575544535755FF36342EFFECEE
-      EEFF858A88FF535755FF53575556000000000000000053575500918F8F003634
-      2EFFECEEEEFF858A88FF918F8F00535755000000000000000000535755005357
-      550036342E00ECEEEE00858A8800535755005357550000000000000000000000
-      00000000000036342E00ECEEEE00858A88000000000000000000000000000000
-      0000000000000000000036342E00ECEEEE00858A880000000000000000000000
-      000000000000535755005357550036342E00ECEEEE00858A8800535755005357
-      55000000000000000000535755009998980036342EFFECEEEEFF858A88FF9795
-      950053575500000000000000000053575544535755FF36342EFFECEEEEFF858A
-      88FF535755FF535755440000000000000000535755FF999898FF36342EFFECEE
-      EEFF858A88FF979595FF535755FF0000000000000000535755FFE9E8E8FF5357
-      55FF36342EFF535755FFE9E8E8FF535755FF0000000000000000535755FFE9E8
-      E8FF535755FF00000000535755FFE9E8E8FF535755FF00000000000000005357
-      55FFE9E8E8FF535755FF53575500535755FFE9E8E8FF535755FF000000000000
-      0000535755FFE9E8E8FF535755FFE9E8E800535755FFE9E8E8FF535755FF0000
-      000053575500535755FFE9E8E8FF535755FF535755FF535755FFE9E8E8FF5357
-      55FF0000000000000000535755FF9E9D9DFFE9E8E8FFE9E8E8FFE9E8E8FFBAB9
-      B9FF535755FF000000000000000053575556535755FF535755FF535755FF5357
-      55FF535755FF5357555600000000
+      4C7A020000000900000018000000D70000000000000078DA6360A01E080E0F0D
+      03E2FF587018929AFF7DBDBDFF5FBE7801C713FAFAC0EA90D580C491CD80F171
+      A86120A4061B9F1C35AD5D1D38DD33B1BFFFBF9989DEFF37EFDE81D581F8686A
+      5C407C6435E8E10303C86A7085373E3578EC724176F3CC193350D44C9F3A15A7
+      DF41EAE815CEC4A8C19736E6CD9D8B92C676EDDC896C2E5169154F3A1F12F902
+      48335023EF10A386D6F902E406A03E06347350E202EA4E901A06A01A06A01AB8
+      1896BC035783277FE154438C5D2036307F31A0E52F743583369F1213EFD8D218
+      BA3E72F3293179070068D29CC0
     }
   end
 end

+ 2 - 8
src/fmodview.lrj

@@ -1,12 +1,5 @@
 {"version":1,"strings":[
 {"hash":211134021,"name":"tfrmmodview.caption","sourcebytes":[78,101,119,32,83,105,122,101],"value":"New Size"},
-{"hash":219345735,"name":"tfrmmodview.lblquality.caption","sourcebytes":[81,117,97,108,105,116,121,32,111,102,32,99,111,109,112,114,101,115,115,32,116,111,32,74,112,103],"value":"Quality of compress to Jpg"},
-{"hash":944,"name":"tfrmmodview.tequality.text","sourcebytes":[56,48],"value":"80"},
-{"hash":20295,"name":"tfrmmodview.rbjpg.caption","sourcebytes":[74,80,71],"value":"JPG"},
-{"hash":18208,"name":"tfrmmodview.rbbmp.caption","sourcebytes":[66,77,80],"value":"BMP"},
-{"hash":21799,"name":"tfrmmodview.rbpng.caption","sourcebytes":[80,78,71],"value":"PNG"},
-{"hash":19839,"name":"tfrmmodview.rbico.caption","sourcebytes":[73,67,79],"value":"ICO"},
-{"hash":21805,"name":"tfrmmodview.rbpnm.caption","sourcebytes":[80,78,77],"value":"PNM"},
 {"hash":12558,"name":"tfrmmodview.btnpath1.caption","sourcebytes":[46,46,46],"value":"..."},
 {"hash":12558,"name":"tfrmmodview.btnpath2.caption","sourcebytes":[46,46,46],"value":"..."},
 {"hash":12558,"name":"tfrmmodview.btnpath3.caption","sourcebytes":[46,46,46],"value":"..."},
@@ -20,5 +13,6 @@
 {"hash":201192154,"name":"tfrmmodview.lblheight.caption","sourcebytes":[72,101,105,103,104,116,32,58],"value":"Height :"},
 {"hash":234596970,"name":"tfrmmodview.lblwidth.caption","sourcebytes":[87,105,100,116,104,32,58],"value":"Width :"},
 {"hash":6159272,"name":"tfrmmodview.tewidth.text","sourcebytes":[87,105,100,116,104],"value":"Width"},
-{"hash":82574836,"name":"tfrmmodview.teheight.text","sourcebytes":[72,101,105,103,104,116],"value":"Height"}
+{"hash":82574836,"name":"tfrmmodview.teheight.text","sourcebytes":[72,101,105,103,104,116],"value":"Height"},
+{"hash":219345735,"name":"tfrmmodview.lblquality.caption","sourcebytes":[81,117,97,108,105,116,121,32,111,102,32,99,111,109,112,114,101,115,115,32,116,111,32,74,112,103],"value":"Quality of compress to Jpg"}
 ]}

+ 15 - 76
src/fmodview.pas

@@ -6,7 +6,7 @@ interface
 
 uses
   SysUtils, Classes, Controls, Forms,
-  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ButtonPanel, uOSForms;
+  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ButtonPanel, Spin, uOSForms;
 
 type
 
@@ -33,16 +33,11 @@ type
     pnlCopyMoveFile: TPanel;
     pnlQuality: TPanel;
     pnlSize: TPanel;
-    rbBmp: TRadioButton;
-    rbIco: TRadioButton;
-    rbJpg: TRadioButton;
     rbPath1: TRadioButton;
     rbPath2: TRadioButton;
     rbPath3: TRadioButton;
     rbPath4: TRadioButton;
     rbPath5: TRadioButton;
-    rbPng: TRadioButton;
-    rbPnm: TRadioButton;
     sddCopyMoveFile: TSelectDirectoryDialog;
     tbQuality: TTrackBar;
     teHeight: TEdit;
@@ -51,7 +46,7 @@ type
     tePath3: TEdit;
     tePath4: TEdit;
     tePath5: TEdit;
-    teQuality: TEdit;
+    teQuality: TSpinEdit;
     teWidth: TEdit;
     procedure btnCancelClick(Sender: TObject);
     procedure btnOkClick(Sender: TObject);
@@ -61,24 +56,17 @@ type
     procedure FormCreate(Sender: TObject);
     procedure FormKeyPress(Sender: TObject; var Key: char);
     procedure FormShow(Sender: TObject);
-    procedure rbBmpChange(Sender: TObject);
-    procedure rbIcoChange(Sender: TObject);
-    procedure rbJpgChange(Sender: TObject);
-    procedure rbPngChange(Sender: TObject);
-    procedure rbPnmChange(Sender: TObject);
-    procedure tbQualityMouseMove(Sender: TObject; Shift: TShiftState; X,
-      Y: Integer);
+    procedure tbQualityChange(Sender: TObject);
     procedure teHeightKeyPress(Sender: TObject; var Key: char);
     procedure teHeightKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
-    procedure teQualityKeyPress(Sender: TObject; var Key: char);
-    procedure teQualityKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
+    procedure teQualityChange(Sender: TObject);
     procedure teWidthKeyPress(Sender: TObject; var Key: char);
     procedure teWidthKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
   private
     { private declarations }
     prX, prY: integer;
   public
-    Path, sExt : string;
+    Path : string;
     { public declarations }
   end; 
 
@@ -100,11 +88,11 @@ end;
 
 procedure TfrmModView.FormClose(Sender: TObject; var CloseAction: TCloseAction);
 begin
-      gCopyMovePath1 := tePath1.Text;
-      gCopyMovePath2 := tePath2.Text;
-      gCopyMovePath3 := tePath3.Text;
-      gCopyMovePath4 := tePath4.Text;
-      gCopyMovePath5 := tePath5.Text;
+  gCopyMovePath1 := tePath1.Text;
+  gCopyMovePath2 := tePath2.Text;
+  gCopyMovePath3 := tePath3.Text;
+  gCopyMovePath4 := tePath4.Text;
+  gCopyMovePath5 := tePath5.Text;
 end;
 
 procedure TfrmModView.FormCreate(Sender: TObject);
@@ -174,58 +162,16 @@ begin
     end;
   if pnlQuality.Visible then
     begin
-      sExt:= '.jpg';
       tbQuality.Enabled:=true;
       lblQuality.Enabled:=True;
       tbQuality.Position:=gViewerJpegQuality;
-      teQuality.Text:=IntToStr(gViewerJpegQuality);
+      teQuality.Value:= gViewerJpegQuality;
     end;
 end;
 
-procedure TfrmModView.rbBmpChange(Sender: TObject);
+procedure TfrmModView.tbQualityChange(Sender: TObject);
 begin
-  sExt:='.bmp';
-  tbQuality.Enabled:=False;
-  teQuality.Enabled:=False;
-  lblQuality.Enabled:=False;
-end;
-
-procedure TfrmModView.rbIcoChange(Sender: TObject);
-begin
-  sExt:='.ico';
-  tbQuality.Enabled:=False;
-  teQuality.Enabled:=False;
-  lblQuality.Enabled:=False;
-end;
-
-procedure TfrmModView.rbJpgChange(Sender: TObject);
-begin
-  sExt:='.jpg';
-  tbQuality.Enabled:=True;
-  teQuality.Enabled:=True;
-  lblQuality.Enabled:=True;
-end;
-
-procedure TfrmModView.rbPngChange(Sender: TObject);
-begin
-  sExt:='.png';
-  tbQuality.Enabled:=False;
-  teQuality.Enabled:=False;
-  lblQuality.Enabled:=False;
-end;
-
-procedure TfrmModView.rbPnmChange(Sender: TObject);
-begin
-  sExt:='.pnm';
-  tbQuality.Enabled:=False;
-  teQuality.Enabled:=False;
-  lblQuality.Enabled:=False;
-end;
-
-procedure TfrmModView.tbQualityMouseMove(Sender: TObject; Shift: TShiftState;
-  X, Y: Integer);
-begin
-  teQuality.Text:= intToStr(tbQuality.Position);
+  teQuality.Value:= tbQuality.Position;
 end;
 
 procedure TfrmModView.btnOkClick(Sender: TObject);
@@ -292,16 +238,9 @@ begin
   end;
 end;
 
-procedure TfrmModView.teQualityKeyPress(Sender: TObject; var Key: char);
-begin
-  if  not (key in ['0'..'9', #8]) then key:=#0;
-end;
-
-procedure TfrmModView.teQualityKeyUp(Sender: TObject; var Key: Word;
-  Shift: TShiftState);
+procedure TfrmModView.teQualityChange(Sender: TObject);
 begin
-  if StrToInt(teQuality.Text)<=100 then
-  tbQuality.Position:=StrToInt(teQuality.Text);
+  tbQuality.Position:= teQuality.Value;
 end;
 
 procedure TfrmModView.teWidthKeyPress(Sender: TObject; var Key: char);

+ 64 - 56
src/fviewer.pas

@@ -1710,61 +1710,74 @@ begin
   CreateTmp;
 end;
 
-
 procedure TfrmViewer.SaveImageAs(var sExt: String; senderSave: boolean; Quality: integer);
 var
-  sFileName: string;
-  ico : TIcon = nil;
-  jpg : TJpegImage = nil;
+  sFileName: String;
   fsFileStream: TFileStreamEx;
-  pnm : TPortableAnyMapGraphic = nil;
 begin
   if senderSave then
-    sFileName:= FileList.Strings[iActiveFile]
-  else
+  begin
+    sExt:= LowerCase(sExt);
+    sFileName:= FileList.Strings[iActiveFile];
+  end
+  else begin
+    with SavePictureDialog do
     begin
-      if not SavePictureDialog.Execute then Exit;
-      sFileName:= ChangeFileExt(SavePictureDialog.FileName, sExt);
+      if not Execute then Exit;
+      sExt:= ExtensionSeparator + GetFilterExt;
+      sFileName:= ChangeFileExt(FileName, sExt);
     end;
 
+    if (sExt = '.jpg') or (sExt = '.jpeg') then
+    begin
+      FModSizeDialog:= TfrmModView.Create(Self);
+      try
+        FModSizeDialog.pnlSize.Visible:= False;
+        FModSizeDialog.pnlCopyMoveFile.Visible:= False;
+        FModSizeDialog.pnlQuality.Visible:= True;
+        FModSizeDialog.Caption:= SavePictureDialog.Title;
+        if FModSizeDialog.ShowModal <> mrOk then Exit;
+        Quality:= FModSizeDialog.teQuality.Value;
+      finally
+        FreeAndNil(FModSizeDialog);
+      end;
+    end;
+  end;
+
   try
     fsFileStream:= TFileStreamEx.Create(sFileName, fmCreate);
     try
       if (sExt = '.jpg') or (sExt = '.jpeg') then
-        begin
-          jpg := TJpegImage.Create;
-          try
-            jpg.Assign(Image.Picture.Graphic);
-            jpg.CompressionQuality := Quality;
-            jpg.SaveToStream(fsFileStream);
-          finally
-            jpg.Free;
+      begin
+        with TJpegImage.Create do
+        try
+          // Special case
+          if Image.Picture.Graphic is TJPEGImage then
+          begin
+            LoadFromRawImage(Image.Picture.Jpeg.RawImage, False);
+          end
+          else begin
+            Assign(Image.Picture.Graphic);
           end;
-        end
+          CompressionQuality := Quality;
+          SaveToStream(fsFileStream);
+        finally
+          Free;
+        end;
+      end
       else if sExt = '.ico' then
-        begin
-          ico := TIcon.Create;
-          try
-            ico.Assign(Image.Picture.Graphic);
-            ico.SaveToStream(fsFileStream);
-          finally
-            ico.Free;
-          end;
-        end
-      else if sExt = '.pnm' then
-        begin
-          pnm := TPortableAnyMapGraphic.Create;
-          try
-            pnm.Assign(Image.Picture.Graphic);
-            pnm.SaveToStream(fsFileStream);
-          finally
-            pnm.Free;
-          end;
-        end
-      else if (sExt = '.png') or (sExt = '.bmp') then
-        begin
-          Image.Picture.SaveToStreamWithFileExt(fsFileStream, sExt);
+      begin
+        with TIcon.Create do
+        try
+          Assign(Image.Picture.Graphic);
+          SaveToStream(fsFileStream);
+        finally
+          Free;
         end;
+      end
+      else begin
+        Image.Picture.SaveToStreamWithFileExt(fsFileStream, sExt);
+      end;
     finally
       FreeAndNil(fsFileStream);
     end;
@@ -2124,6 +2137,13 @@ begin
 
   HotMan.Register(pnlText ,'Text files');
   HotMan.Register(pnlImage,'Image files');
+
+  SavePictureDialog.Filter:= GraphicFilter(TPortableNetworkGraphic) + '|' +
+                             GraphicFilter(TBitmap) + '|' +
+                             GraphicFilter(TJPEGImage) + '|' +
+                             GraphicFilter(TIcon) + '|' +
+                             GraphicFilter(TPortableAnyMapGraphic);
+
 end;
 
 procedure TfrmViewer.FormKeyPress(Sender: TObject; var Key: Char);
@@ -3259,25 +3279,13 @@ begin
 end;
 
 procedure TfrmViewer.cm_SaveAs(const Params: array of string);
+var
+  sExt: String;
 begin
   if bAnimation or bImage then
   begin
-    FModSizeDialog:= TfrmModView.Create(Self);
-    try
-      FModSizeDialog.pnlSize.Visible:=false;
-      FModSizeDialog.pnlCopyMoveFile.Visible :=false;
-      FModSizeDialog.pnlQuality.Visible:=true;
-      FModSizeDialog.Caption:= rsViewImageType;
-      if FModSizeDialog.ShowModal = mrOk then
-      begin
-        if StrToInt(FModSizeDialog.teQuality.Text)<=100 then
-          SaveImageAs(FModSizeDialog.sExt,false,StrToInt(FModSizeDialog.teQuality.Text))
-        else
-          msgError(rsViewBadQuality);
-      end
-    finally
-      FreeAndNil(FModSizeDialog);
-    end;
+    sExt:= EmptyStr;
+    SaveImageAs(sExt, False, gViewerJpegQuality);
   end;
 end;