这是修正+取MD5的方法

function MD5FileTextPng(filename: AnsiString): AnsiString;
var
buf: array[..MAX_PATH - ] of Char;
path: AnsiString;
stream: TFileStream;
destStream: TMemoryStream;
destfile, tmpText: string;
I, len: Integer;
endbuf: array[..] of Byte;
firstChar: Byte;
strstream: TStringStream;
const
pngEndBuf: array[..] of Byte = ($AE, $, $, $);
begin
GetTempPath(Length(buf), @buf[]);
path := AnsiString(string(buf));
tmpText := ExtractFileName(filename);
tmpText := Copy(tmpText, , Length(tmpText) - ); strstream := TStringStream.Create(tmpText, TEncoding.UTF8);
strstream.Position := ; stream := TFileStream.Create(filename, fmOpenRead);
try
destStream := TMemoryStream.Create;
try
stream.Position := ;
for I := to stream.Size - do
begin
stream.Read(firstChar, );
if firstChar <> $AE then
Continue;
stream.Position := stream.Position - ;
stream.Read(endbuf[], );
if CompareMem(@endbuf[], @pngEndBuf[], ) then
begin
len := stream.Position;
Break;
end;
end; stream.Position := ;
destStream.CopyFrom(stream, len); destfile := path + '\' + GetRamdomText();
if FileExists(destfile) then
DeleteFile(destfile); destStream.CopyFrom(strstream, strstream.Size);
destStream.SaveToFile(destfile);
strstream.Free; Result := MD5F(destfile);
finally
destStream.Free;
end;
finally
stream.Free;
end; if FileExists(destfile) then
DeleteFile(destfile);
end;

这是批量修正PNG的代码,pas + dfm

uFixpng.pas
unit uFixpng;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uMD5, Vcl.StdCtrls, Vcl.FileCtrl,
System.IOUtils, System.Types, Vcl.Samples.Gauges; type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Gauge1: TGauge;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form2: TForm2; implementation {$R *.dfm} function FixPng(filename: AnsiString; destFileName: string): Boolean;
var
stream: TFileStream;
destStream: TMemoryStream;
I, len: Integer;
endbuf: array[..] of Byte;
firstChar: Byte;
const
pngEndBuf: array[..] of Byte = ($AE, $, $, $);
begin
stream := TFileStream.Create(filename, fmOpenRead);
try
destStream := TMemoryStream.Create;
try
stream.Position := ;
for I := to stream.Size - do
begin
stream.Read(firstChar, );
if firstChar <> $AE then Continue;
stream.Position := stream.Position - ;
stream.Read(endbuf[], );
if CompareMem(@endbuf[], @pngEndBuf[], ) then
begin
len := stream.Position;
Break;
end;
end; stream.Position := ;
destStream.CopyFrom(stream, len);
destStream.SaveToFile(destFileName);
finally
destStream.Free;
end;
finally
stream.Free;
end; Result := True;
end; procedure TForm2.Button1Click(Sender: TObject);
var
files: TStringDynArray;
path, destPath, destFile: string;
I: Integer;
begin
TButton(Sender).Enabled := False;
Gauge1.Visible := True;
try
path := Trim(Edit1.Text);
if not TDirectory.Exists(path) then Exit; files := TDirectory.GetFiles(path, '*.png'); destPath := TPath.Combine(path, 'Fix-' + FormatDateTime('hhnnss', Now)); if not TDirectory.Exists(destPath) then
TDirectory.CreateDirectory(destPath); Gauge1.Progress := ;
Gauge1.MinValue := ;
Gauge1.MaxValue := Length(files);
for I := Low(files) to High(files) do
begin
destFile := TPath.Combine(destPath, ExtractFileName(files[I]));
FixPng(files[I], destFile);
Gauge1.Progress := Gauge1.Progress + ;
Application.ProcessMessages;
end;
finally
TButton(Sender).Enabled := True;
Gauge1.Visible := False;
end;
end; procedure TForm2.Edit1DblClick(Sender: TObject);
var
path: string;
begin
SelectDirectory('选择png文件夹', '', path);
Edit1.Text := path;
end; procedure TForm2.FormCreate(Sender: TObject);
begin
Position := poScreenCenter;
end; end.

uFixpng.dfm

object Form2: TForm2
Left =
Top =
Caption = ##'png'
ClientHeight =
ClientWidth =
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch =
TextHeight =
object Label1: TLabel
Left =
Top =
Width =
Height =
Caption = 'PNG'####
end
object Gauge1: TGauge
Left =
Top =
Width =
Height =
Align = alBottom
Color = clNavy
ParentColor = False
Progress =
ShowText = False
Visible = False
end
object Edit1: TEdit
Left =
Top =
Width =
Height =
TabOrder =
OnDblClick = Edit1DblClick
end
object Button1: TButton
Left =
Top =
Width =
Height =
Caption = ####
TabOrder =
OnClick = Button1Click
end
end

修正png的更多相关文章

  1. [修正] Firemonkey 中英文混排折行问题(移动平台)

    问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题. 适用: ...

  2. [修正] Firemonkey Android 显示 Emoji (颜文字)

    问题:在 Android 平台下,显示 Emoji 文字,无法显示彩色(皆为黑色),例如 Edit 控件,即使将 Edit.ControlType = Platform 设为平台原生控件,还是没用(真 ...

  3. 2016 正确 sublime安装PHPcs PHPcodesniffer代码规范提示插件,修正网上部分不详细描述

    对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香!-------------------14:37 2016/3/212016 正确 sublime安装PHPcs PHPcodesniff ...

  4. Mint Linux 安装 DotnetCore 遭遇无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

    evlon@evlon-ThinkPad-T530 ~ $ apt install dotnet-dev-1.0.0-preview2-003121 正在读取软件包列表... 完成 正在分析软件包的依 ...

  5. 修正IE6不支持position:fixed的bug(转)

    众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著.前些天我做自己的博客模板的时候,遇到了这个问题.当时就简单的无视了IE6— ...

  6. [修正] 移动平台曲线不平滑的问题(如:TRectangle, TPath...等)

    问题:从 XE4 以来,Firemonkey 曲线绘图在移动平台不平滑的问题一直令人诟病,提交到官方的 QC 也是族繁不及备载,官方似乎有意的避开这个问题,迟迟没有修正. 适用版本:XE4 ~ Ber ...

  7. [修正] Firemonkey TSelection 控件等比缩放时,左下角拉动问题

    说明:TSelection 控件,当在属性 Proportional = True 为等比缩放时,拉动左下角,右上角会跟着移动. 适用:Berlin 10.1.1 (或之前版本) Firemonkey ...

  8. [修正] Berlin Firemonkey Windows 控件左方显示虚线问题

    说明:在 Wndows 显示时,有时控件左方会显示一条虚线 适用:Berlin Firemonkey 修正方法: 请将源码 FMX.Platform.Win.pas 复制到自己的工程目录里,再进行修改 ...

  9. 查看数据库表的数据量和SIZE大小的脚本修正

    在使用桦仔的分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)的脚本时,遇到下面一些错误 这个是因为这些表的Schema是Maint,而不是默认的dbo,造成下面这段SQ ...

  10. WordPress基础:Gravatar头像修正

    WordPress会根据你的邮箱,从Gravatar获取你的头像,如果没有在Gravatar设置头像,将使用默认的,然而设置了之后显示还可能会出现以下问题: Gravatar头像读取困难,将影响网站读 ...

随机推荐

  1. 一 Spring概述

    知识点概要: 1 SpringIOC入门(XML).Spring的Bean管理.Spring属性注入 2 SpringIOC注解方式.Spring的AOP开发(XML) 3 Spring的AOP注解开 ...

  2. Duilib XML嵌套/自定义控件

    转载:https://www.jianshu.com/p/0fe8610dcc8d  // https://github.com/Washington-DC/Duilib-ListView  //这是 ...

  3. Linux 下面搭建KMS服务器

    1. 下载安装Linux 版的KMS服务软件 # wget https://github.com/Wind4/vlmcsd/releases/download/svn1111/binaries.tar ...

  4. C++11通过拷贝构造器拷贝const字段(待解决)

    问题梗概如标题所述. 在今天实现Token类的时候,遇到的问题. 我希望将Token类设定为immutable属性的,这样实现的方式是将这个类内的所有字段均设置为const型,同时每个字段均为publ ...

  5. 设计模式课程 设计模式精讲 18-2 迭代器模式coding

    1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...

  6. 「ZJOI2006」物流运输

    题目 [内存限制:$256MiB$][时间限制:$1000ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] [题目描述] 物流公司要把一批货物从码头 A 运到码头 B.由于货物量比较 ...

  7. change事件和input事件的区别

    input事件: input事件在输入框输入的时候回实时响应并触发 change事件: change事件在input失去焦点才会考虑触发,它的缺点是无法实时响应.与blur事件有着相似的功能,但与bl ...

  8. thinkphp5.1 源码阅读

    传送地址:https://github.com/cshaptx4869/tp5.1-code-read 包含: 自动加载 容器 配置文件 钩子 门面

  9. ionic3记录之弹窗Alert

    一个业务流程需要多个弹窗: 在上一个弹窗的onDidDissmiss写下一个弹窗:

  10. css 盒子模型应用

    盒子模型应用 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...