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

图片压缩,该如何解决

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

热点排行