读书人

图片压缩,该怎么处理

发布时间: 2012-10-19 16:53:36 作者: rapoo

图片压缩
已知加解密函数
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);
if SourcePtr^ > $7F then begin
Inc(SourcePtr);
for I := 0 to RunLength - 1 do begin
for j := 1 to bitLength - 1 do
begin
TargetPtr^ := SourcePtr^;
Inc(SourcePtr);
Inc(TargetPtr);
end;
TargetPtr^ := SourcePtr^;
Dec(SourcePtr, bitLength - 1);
Inc(TargetPtr);
end;
Inc(SourcePtr, bitLength);
end
else begin
Inc(SourcePtr);
Move(SourcePtr^, TargetPtr^, bitLength * RunLength);
Inc(SourcePtr, bitLength * RunLength);
Inc(TargetPtr, bitLength * RunLength);
end;
Inc(Counter, bitLength * RunLength);
end;
Result := Counter = Count;
end;

求一可以把图片加密压缩并返回为BYTE类型的DEMO,
如下:
Const
Width = 300;
Height = 100;
Buffer: array[0..XX - 1] of Byte = (
$FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF,
$FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF, $FF, $FF, $00, $FF, $FF,
.....省略N多
);


[解决办法]
DEMO已发送至你的邮箱,请查收

读书人网 >.NET

热点推荐