• R/O
  • SSH
  • HTTPS

id3v2editorplus: Commit


Commit MetaInfo

Revision49 (tree)
Zeit2020-03-23 08:35:27
Autorderekwildstar

Log Message

Trocado o componente TImage pelo componente TImage32 da suite Graphics32
Criada a classe helper "TImage32Helper" para implementar o método LoadFromStream, responsável por carregar em um TImage32 jpgs ou pngs com canais alfa
Métodos foram simplificados pelo uso de TMemoryStream para guardar imagens dentro de TAPICItem
Criadas as funções IsPng e IsJpg para identificar o conteúdo de um TMemoryStream, consultando os números mágicos deste conteúdo
Criada uma classe mediadora para TImage32, a fim de implementar o fundo transparente da mesma

Ändern Zusammenfassung

Diff

--- trunk/V2/prj/ID3v2EditorPlus.dproj (revision 48)
+++ trunk/V2/prj/ID3v2EditorPlus.dproj (revision 49)
@@ -152,9 +152,7 @@
152152 <Source>
153153 <Source Name="MainSource">ID3v2EditorPlus.dpr</Source>
154154 </Source>
155- <Excluded_Packages>
156- <Excluded_Packages Name="$(BDSBIN)\dclofficexp260.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
157- </Excluded_Packages>
155+ <Excluded_Packages/>
158156 </Delphi.Personality>
159157 <Deployment Version="3">
160158 <DeployFile LocalName="..\bin\exe\ID3v2EditorPlus.exe" Configuration="Debug" Class="ProjectOutput">
--- trunk/V2/src/UClassesAjudantes.pas (revision 48)
+++ trunk/V2/src/UClassesAjudantes.pas (revision 49)
@@ -3,7 +3,7 @@
33 interface
44
55 uses
6- Classes, ExtCtrls, ID3v2Library, UClassesETipos;
6+ Classes, ExtCtrls, ID3v2Library, UClassesETipos, GR32_Image, GR32;
77
88 type
99 TTimerHelper = class helper for TTimer
@@ -79,10 +79,15 @@
7979 property TextoANSI: AnsiString read GetTextoANSI;
8080 end;
8181
82+ TImage32Helper = class helper for TImage32
83+ public
84+ procedure LoadFromStream(AStream: TMemoryStream);
85+ end;
86+
8287 implementation
8388
8489 uses
85- WinApi.Windows, System.SysUtils;
90+ WinApi.Windows, WinApi.Messages, System.SysUtils, GR32_Png, Graphics;
8691
8792 { TTimerHelper }
8893
@@ -195,8 +200,6 @@
195200 end;
196201
197202 procedure TID3v2TagHelper.AtribuirImagens(const AAPIC: TAPIC);
198-var
199- StreamDaImagem: TStream;
200203 begin
201204 ExcluirTodosOsFrames('APIC');
202205
@@ -203,22 +206,13 @@
203206 if AAPIC.Count = 0 then
204207 Exit;
205208
206- StreamDaImagem := TMemoryStream.Create;
207- try
208-
209- for var APICItem: TCollectionItem in AAPIC do
210- begin
211- TMemoryStream(StreamDaImagem).Clear;
212-
213- TAPICItem(APICItem).Imagem.SaveToStream(StreamDaImagem);
214- SetUnicodeCoverPictureFromStream(AddFrame('APIC')
215- ,TAPICItem(APICItem).Descricao
216- ,StreamDaImagem
217- ,String(TAPICItem(APICItem).TipoMime)
218- ,TAPICItem(APICItem).TipoDaImagem);
219- end;
220- finally
221- StreamDaImagem.Free;
209+ for var APICItem: TCollectionItem in AAPIC do
210+ begin
211+ SetUnicodeCoverPictureFromStream(AddFrame('APIC')
212+ ,TAPICItem(APICItem).Descricao
213+ ,TAPICItem(APICItem).Imagem
214+ ,String(TAPICItem(APICItem).TipoMime)
215+ ,TAPICItem(APICItem).TipoDaImagem);
222216 end;
223217 end;
224218
@@ -516,4 +510,31 @@
516510 until ((Byte1 + Byte2) = 0) or (Position = Size);
517511 end;
518512
513+{ TImage32Helper }
514+
515+procedure TImage32Helper.LoadFromStream(AStream: TMemoryStream);
516+begin
517+ AStream.Position := 0;
518+
519+ if IsPng(AStream.Memory) then
520+ with TPortableNetworkGraphic32.Create do
521+ try
522+ LoadFromStream(AStream);
523+ AssignTo(Bitmap);
524+ finally
525+ Free;
526+ end
527+ else if IsJpg(AStream.Memory) then
528+ begin
529+ var Picture: TPicture := TPicture.Create;
530+
531+ try
532+ Picture.LoadFromStream(AStream);
533+ Bitmap.Assign(Picture);
534+ finally
535+ Picture.Free;
536+ end;
537+ end;
538+end;
539+
519540 end.
--- trunk/V2/src/UClassesETipos.pas (revision 48)
+++ trunk/V2/src/UClassesETipos.pas (revision 49)
@@ -4,7 +4,7 @@
44
55 uses
66 System.Classes, System.SysUtils, Generics.Collections, SHDocVw, ExtCtrls,
7- ActnList, StdCtrls, ID3v2Library, Vcl.Graphics;
7+ ActnList, StdCtrls, ID3v2Library, GR32_Image;
88
99 type
1010 TContexto = (cId3v1,cId3v2);
@@ -165,7 +165,7 @@
165165
166166 TAPICItem = class(TCollectionItem)
167167 private
168- FImagem: TPicture;
168+ FImagem: TMemoryStream;
169169 FDescricao: String;
170170 FTipoMime: AnsiString;
171171 FTipoDaImagem: Byte;
@@ -173,7 +173,7 @@
173173 constructor Create(ACollection: TCollection); override;
174174 destructor Destroy; override;
175175
176- property Imagem: TPicture read FImagem write FImagem;
176+ property Imagem: TMemoryStream read FImagem write FImagem;
177177 property Descricao: String read FDescricao write FDescricao;
178178 property TipoMime: AnsiString read FTipoMime write FTipoMime;
179179 property TipoDaImagem: Byte read FTipoDaImagem write FTipoDaImagem;
@@ -183,7 +183,7 @@
183183 private
184184 FIndice: SmallInt;
185185
186- FImagem: TImage;
186+ FImagem: TImage32;
187187 FDescricao: TLabeledEdit;
188188 FMime: TLabeledEdit;
189189 FTipo: TComboBox;
@@ -202,7 +202,7 @@
202202 procedure Exibir(AIndice: Word);
203203 function GetTipoMimeDaImagemAtual: String;
204204 public
205- constructor Create(AImagem: TImage; ADescricao: TLabeledEdit; AMime: TLabeledEdit; ATipo: TComboBox; AProximaImagem: TAction; AImagemAnterior: TAction; ASalvarImagem: TAction; ARemoverImagem: TAction; ASubstituirImagem: TAction; AExportarImagemAPIC: TAction; AContador: TLabel; AContadorSombra: TLabel);
205+ constructor Create(AImagem: TImage32; ADescricao: TLabeledEdit; AMime: TLabeledEdit; ATipo: TComboBox; AProximaImagem: TAction; AImagemAnterior: TAction; ASalvarImagem: TAction; ARemoverImagem: TAction; ASubstituirImagem: TAction; AExportarImagemAPIC: TAction; AContador: TLabel; AContadorSombra: TLabel);
206206
207207 procedure Limpar;
208208 procedure Proxima(AUltima: Boolean = False);
@@ -220,6 +220,8 @@
220220 end;
221221
222222 function SwapEndian32(AValue: DWORD): DWORD; register;
223+function IsPng(AData: PByte): Boolean;
224+function IsJpg(AData: PByte): Boolean;
223225
224226 implementation
225227
@@ -231,6 +233,25 @@
231233 bswap eax
232234 end;
233235
236+function IsPng(AData: PByte): Boolean;
237+begin
238+ Result := (AData[0] = $89)
239+ and (AData[1] = $50)
240+ and (AData[2] = $4E)
241+ and (AData[3] = $47)
242+ and (AData[4] = $0D)
243+ and (AData[5] = $0A)
244+ and (AData[6] = $1A)
245+ and (AData[7] = $0A);
246+end;
247+
248+function IsJpg(AData: PByte): Boolean;
249+begin
250+ Result := (AData[0] = $FF)
251+ and (AData[1] = $D8)
252+ and (AData[2] = $FF);
253+end;
254+
234255 { TUSLT }
235256
236257 function TUSLT.Add: TUSLTItem;
@@ -1155,7 +1176,7 @@
11551176 constructor TAPICItem.Create(ACollection: TCollection);
11561177 begin
11571178 inherited;
1158- FImagem := TPicture.Create;
1179+ FImagem := TMemoryStream.Create;
11591180 FDescricao := '';
11601181 FTipoMime := '';
11611182 FTipoDaImagem := 0;
@@ -1205,7 +1226,7 @@
12051226
12061227 if Count = 0 then
12071228 begin
1208- FImagem.Picture := nil;
1229+ FImagem.Bitmap.Delete;
12091230 FDescricao.Text := '';
12101231 FTipo.ItemIndex := 0;
12111232 end;
@@ -1235,16 +1256,9 @@
12351256 APIC.TipoMime := ArquivoAPIC.TextoANSI;
12361257 ArquivoAPIC.Read(APIC.FTipoDaImagem,1);
12371258
1238- var StreamDaImagem: TMemoryStream := TMemoryStream.Create;
1259+ APIC.Imagem.CopyFrom(ArquivoAPIC,ArquivoAPIC.Size - ArquivoAPIC.Position);
1260+ APIC.Imagem.Position := 0;
12391261
1240- try
1241- StreamDaImagem.CopyFrom(ArquivoAPIC,ArquivoAPIC.Size - ArquivoAPIC.Position);
1242- StreamDaImagem.Position := 0;
1243- APIC.Imagem.LoadFromStream(StreamDaImagem);
1244- finally
1245- StreamDaImagem.Free;
1246- end;
1247-
12481262 if ANovoAPIC then
12491263 Proxima(True)
12501264 else
@@ -1264,7 +1278,7 @@
12641278 Items[FIndice].TipoDaImagem := FTipo.ItemIndex;
12651279 end;
12661280
1267-constructor TAPIC.Create(AImagem: TImage; ADescricao: TLabeledEdit; AMime: TLabeledEdit; ATipo: TComboBox; AProximaImagem, AImagemAnterior, ASalvarImagem, ARemoverImagem, ASubstituirImagem, AExportarImagemAPIC: TAction; AContador, AContadorSombra: TLabel);
1281+constructor TAPIC.Create(AImagem: TImage32; ADescricao: TLabeledEdit; AMime: TLabeledEdit; ATipo: TComboBox; AProximaImagem, AImagemAnterior, ASalvarImagem, ARemoverImagem, ASubstituirImagem, AExportarImagemAPIC: TAction; AContador, AContadorSombra: TLabel);
12681282 begin
12691283 inherited Create(TAPICItem);
12701284
@@ -1315,7 +1329,7 @@
13151329 if (not Assigned(FImagem)) or (Count = 0) or (AIndice > Pred(Count)) then
13161330 Exit;
13171331
1318- FImagem.Picture.Assign(Items[AIndice].Imagem);
1332+ FImagem.LoadFromStream(Items[AIndice].Imagem);
13191333
13201334 var OnChangeOriginal: TNotifyEvent;
13211335
@@ -1372,9 +1386,9 @@
13721386
13731387 APIC.Imagem.LoadFromFile(AArquivo);
13741388
1375- if APIC.Imagem.Graphic.ClassNameIs('TPNGImage') then
1389+ if IsPng(APIC.Imagem.Memory) then
13761390 APIC.TipoMime := 'image/png'
1377- else if APIC.Imagem.Graphic.ClassNameIs('TJPEGImage') then
1391+ else if IsJpg(APIC.Imagem.Memory) then
13781392 APIC.TipoMime := 'image/jpeg'
13791393 else
13801394 begin
@@ -1395,7 +1409,7 @@
13951409 Clear;
13961410 FIndice := -1;
13971411
1398- FImagem.Picture := nil;
1412+ FImagem.Bitmap.Delete;
13991413 FDescricao.Clear;
14001414 FTipo.ItemIndex := 0;
14011415 FRemoverImagem.Enabled := False;
@@ -1441,15 +1455,8 @@
14411455 // Tipo da imagem
14421456 Write(Items[FIndice].TipoDaImagem,1);
14431457
1444- var StreamDaImagem: TMemoryStream := TMemoryStream.Create;
1445-
1446- try
1447- Items[FIndice].Imagem.SaveToStream(StreamDaImagem);
1448- StreamDaImagem.Position := 0;
1449- Write(StreamDaImagem.Memory^,StreamDaImagem.Size);
1450- finally
1451- StreamDaImagem.Free;
1452- end;
1458+ // Dados da Imagem
1459+ Write(Items[FIndice].Imagem.Memory^,Items[FIndice].Imagem.Size);
14531460 finally
14541461 Free;
14551462 end;
--- trunk/V2/src/UFORMPrincipal.pas (revision 48)
+++ trunk/V2/src/UFORMPrincipal.pas (revision 49)
@@ -7,9 +7,19 @@
77 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UDAMOPrincipal, Vcl.ComCtrls,
88 Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Buttons, UPngSpeedButton, Vcl.Imaging.GIFImg,
99 Vcl.Imaging.pngimage, Vcl.Imaging.jpeg, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls, Vcl.ActnMenus,
10- Vcl.OleCtrls, SHDocVw;
10+ Vcl.OleCtrls, SHDocVw, GR32_Image, GR32, GR32_Backends;
1111
1212 type
13+ // Incrivelmente TImage32 não possui uma propridade Transparent. A classe
14+ // interposer faz com que este componente fique transparente. A versão
15+ // original está no link, que cria um componente derivado com a propriedade
16+ // que pode ser configurada em DesignTime
17+ // https://stackoverflow.com/questions/11190472/transparent-image-control-with-resampling-in-delphi
18+ TImage32 = class(GR32_Image.TImage32)
19+ public
20+ procedure ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer); override;
21+ end;
22+
1323 TFORMPrincipal = class(TForm)
1424 PACOPrincipal: TPageControl;
1525 TASHID3v1: TTabSheet;
@@ -67,7 +77,7 @@
6777 LABEInformacaoInicial: TLabel;
6878 LAEDDescricaoDaImagem: TLabeledEdit;
6979 PANLImagemAnexada: TPanel;
70- IMAGAPIC: TImage;
80+ IMAGAPIC: TImage32;
7181 CMBXTipoDaImagem: TComboBox;
7282 LABETipoDaImagem: TLabel;
7383 PNSBProximaImagem: TPngSpeedButton;
@@ -202,4 +212,25 @@
202212 FDAMOPrincipal.AtualizarLetreiro;
203213 end;
204214
215+{ TImage32 }
216+
217+procedure TImage32.ExecClearBackgnd(Dest: TBitmap32; StageNum: Integer);
218+var
219+ P: TPoint;
220+ SaveIndex: Integer;
221+begin
222+ if Assigned(Parent) and not (Assigned(Bitmap) and (BitmapAlign = baTile)) then
223+ begin
224+ SaveIndex := SaveDC(Dest.Handle);
225+ GetViewportOrgEx(Dest.Handle, P);
226+ SetViewportOrgEx(Dest.Handle, P.X - Left, P.Y - Top, nil);
227+ IntersectClipRect(Dest.Handle, 0, 0, Parent.ClientWidth, Parent.ClientHeight);
228+ Parent.Perform(WM_ERASEBKGND, Dest.Handle, 0);
229+ Parent.Perform(WM_PAINT, Dest.Handle, 0);
230+ RestoreDC(Dest.Handle, SaveIndex);
231+ end
232+ else
233+ inherited;
234+end;
235+
205236 end.
--- trunk/V2/Leia-me.txt (revision 48)
+++ trunk/V2/Leia-me.txt (revision 49)
@@ -2,3 +2,8 @@
22 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯
33 1) PNG Components (https://osdn.net/projects/pngcdxme/) - Instalar normalmente
44 2) Anak Krakatoa Delphi Framework (https://osdn.net/projects/akdf/) - Instalar normalmente
5+3) GR32PNG (https://github.com/graphics32/GR32PNG) - Baixar para utilizar seus arquivos apenas
6+4) graphics32 (https://github.com/graphics32/graphics32)
7+ A) Abra o grupo de projetos contendo os pacotes correspondentes ao seu Delphi
8+ B) No pacote runtime adicione as units GR32_Png e GR32_PortableNetworkGraphic
9+ C) Compile e instale os pacotes, com isso você terá os dcu correspondentes a estas duas units e poderá utilizá-las normalmente
Show on old repository browser