图片压缩,该如何解决
图片压缩
已知加解密函数
function TForm1.EncodeRLE(const Source, Target: Pointer; Count: Integer; bitLength: Byte): Integer;
var
i: Integer;
DiffCount, // pixel count until two identical
SameCount: Integer; // number of identical adjacent pixels
SourcePtr,
TargetPtr: PByte;
begin
Result := 0;
SourcePtr := Source;
TargetPtr := Target;
while Count > 0 do begin
DiffCount := CountDiffPixels(SourcePtr, bitLength, Count);
SameCount := CountSamePixels(SourcePtr, bitLength, Count);
if DiffCount > 128 then
DiffCount := 128;
if SameCount > 128 then
SameCount := 128;
if DiffCount > 0 then begin
TargetPtr^ := DiffCount - 1;
Inc(TargetPtr);
Dec(Count, DiffCount);
Inc(Result, (DiffCount * bitLength) + 1);
while DiffCount > 0 do begin
for i := 0 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
Dec(DiffCount);
end;
end;
if SameCount > 1 then begin
TargetPtr^ := (SameCount - 1) or $80;
Inc(TargetPtr);
Dec(Count, SameCount);
Inc(Result, bitLength + 1);
Inc(SourcePtr, (SameCount - 1) * bitLength);
for i := 0 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
end;
end;
end;
function TWMMyImageImages.DecodeRLE(const Source, Target: Pointer; Count: Cardinal; bitLength: Byte): Boolean;
var
I, j: Integer;
SourcePtr,
TargetPtr: PByte;
RunLength: Cardinal;
Counter: Cardinal;
begin
Counter := 0;
TargetPtr := Target;
SourcePtr := Source;
while Counter < Count do begin
RunLength := 1 + (SourcePtr^ and $7F);
已知加解密函数
function TForm1.EncodeRLE(const Source, Target: Pointer; Count: Integer; bitLength: Byte): Integer;
var
i: Integer;
DiffCount, // pixel count until two identical
SameCount: Integer; // number of identical adjacent pixels
SourcePtr,
TargetPtr: PByte;
begin
Result := 0;
SourcePtr := Source;
TargetPtr := Target;
while Count > 0 do begin
DiffCount := CountDiffPixels(SourcePtr, bitLength, Count);
SameCount := CountSamePixels(SourcePtr, bitLength, Count);
if DiffCount > 128 then
DiffCount := 128;
if SameCount > 128 then
SameCount := 128;
if DiffCount > 0 then begin
TargetPtr^ := DiffCount - 1;
Inc(TargetPtr);
Dec(Count, DiffCount);
Inc(Result, (DiffCount * bitLength) + 1);
while DiffCount > 0 do begin
for i := 0 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
Dec(DiffCount);
end;
end;
if SameCount > 1 then begin
TargetPtr^ := (SameCount - 1) or $80;
Inc(TargetPtr);
Dec(Count, SameCount);
Inc(Result, bitLength + 1);
Inc(SourcePtr, (SameCount - 1) * bitLength);
for i := 0 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
end;
end;
end;
function TWMMyImageImages.DecodeRLE(const Source, Target: Pointer; Count: Cardinal; bitLength: Byte): Boolean;
var
I, j: Integer;
SourcePtr,
TargetPtr: PByte;
RunLength: Cardinal;
Counter: Cardinal;
begin
Counter := 0;
TargetPtr := Target;
SourcePtr := Source;
while Counter < Count do begin
RunLength := 1 + (SourcePtr^ and $7F);