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

This commit is contained in:
Alexander Koblov 2023-07-09 17:09:31 +03:00
commit 22f40b4864
4 changed files with 108 additions and 255 deletions

View file

@ -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

View file

@ -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"}
]}

View file

@ -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);
procedure TfrmModView.teQualityChange(Sender: TObject);
begin
if not (key in ['0'..'9', #8]) then key:=#0;
end;
procedure TfrmModView.teQualityKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
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);

View file

@ -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
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);
CompressionQuality := Quality;
SaveToStream(fsFileStream);
finally
Free;
end;
end
else if sExt = '.ico' then
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;