首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

图片压缩,该怎么处理

2012-10-19 
图片压缩已知加解密函数function TForm1.EncodeRLE(const Source, Target: Pointer Count: Integer bitL

图片压缩
已知加解密函数
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已发送至你的邮箱,请查收

热点排行