终于登上来了,请教达人,看看我的程序
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,jpeg,zlib;type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Button2: TButton;
Image2: TImage;
Button3: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
bmpstream:tmemorystream;
deststream:array of tmemorystream;
leftsize:integer;
ypos:integer=0;
xpos:integer=0;
// image:Timage;
//jpgstream:TJPEGImage;
ss:tcanvas;
jy:tmemorystream;implementation
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); var SourceStream: TDecompressionStream; DestStream: TMemoryStream; Buffer: PChar; count:integer;
Begin //从被压缩的图像流中读出原始图像的尺寸 // CompressedStream.ReadBuffer(Count, SizeOf(Count));
// form1.edit1.Text:=inttostr(count);
//根据图像尺寸大小为将要读入的原始图像流分配内存块
count:= CompressedStream.Size;
GetMem(Buffer,count); DestStream := TMemoryStream.Create; SourceStream := TDecompressionStream.Create(CompressedStream); Try //将被压缩的图像流解压缩,然后存入 Buffer内存块中 SourceStream.ReadBuffer(Buffer^, Count); //将原始图像流保存至 DestStream流中 DestStream.WriteBuffer(Buffer^, Count); DestStream.Position := 0;//复位流指针 //从 DestStream流中载入原始图像流 Bmp.LoadFromStream(DestStream); finally FreeMem(Buffer); DestStream.Free; end; end;
procedure ScreenCap(LeftPos,TopPos,
RightPos,BottomPos:integer);
var
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
begin
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY','','',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
end;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var count:integer;
DestStream:tmemorystream;
sourcestream:TCompressionStream;
begin screencap(xpos,ypos,screen.Width,screen.Height);
bmpstream.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\source.dat');
image1.Picture.Bitmap.LoadFromStream(bmpstream);
Count:=bmpstream.Size;
DestStream:=TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(cldefault, DestStream);
try
bmpStream.SaveToStream(SourceStream);
SourceStream.Free;
bmpstream.Clear;
bmpstream.WriteBuffer(Count, SizeOf(Count));
bmpstream.CopyFrom(DestStream, 0);
// jy.CopyFrom(DestStream, 0);
finally
deststream.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\yasuo.dat');
DestStream.Free;
end;
//deststream.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\dest.dat);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//deststream:=tmemorystream.Create;
bmpstream:=tmemorystream.Create;
jy:=tmemorystream.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bmpstream.Destroy;
//deststream.destory;
end;procedure TForm1.Button2Click(Sender: TObject);
var CompressedStream: TFileStream;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
//以文件流的只读方式打开自定义的压缩格式文件
CompressedStream := TFileStream.Create('E:\Documents and Settings\shenhong\桌面\新建文件夹\yasuo.dat', fmOpenRead);
//CompressedStream.Create();
Try
//将被压缩的图像流进行解压缩
UnCompressBitmap(CompressedStream, Bmp);
//将原始图像流还原为指定的 BMP文件
Bmp.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\jieyasuo.dat' );
image2.Picture.Bitmap:=bmp;
image2.Refresh;
finally
Bmp.Free;
CompressedStream.Free;
end;
end;
94K
本来是做的一个屏幕抓取,抓下来的大小是3M,转换为jpeg压缩之后是94K,用zlib压缩后是65K
所以打算用zlib,但是我解压缩之后发现用image显示的图象是黑色的图象,但是解压缩之后文件的大小和以前的一样,不知道是什么原因.有人帮忙吗?谢谢
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,jpeg,zlib;type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Button2: TButton;
Image2: TImage;
Button3: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
bmpstream:tmemorystream;
deststream:array of tmemorystream;
leftsize:integer;
ypos:integer=0;
xpos:integer=0;
// image:Timage;
//jpgstream:TJPEGImage;
ss:tcanvas;
jy:tmemorystream;implementation
procedure UnCompressBitmap(const CompressedStream: TFileStream; var Bmp: TBitmap); var SourceStream: TDecompressionStream; DestStream: TMemoryStream; Buffer: PChar; count:integer;
Begin //从被压缩的图像流中读出原始图像的尺寸 // CompressedStream.ReadBuffer(Count, SizeOf(Count));
// form1.edit1.Text:=inttostr(count);
//根据图像尺寸大小为将要读入的原始图像流分配内存块
count:= CompressedStream.Size;
GetMem(Buffer,count); DestStream := TMemoryStream.Create; SourceStream := TDecompressionStream.Create(CompressedStream); Try //将被压缩的图像流解压缩,然后存入 Buffer内存块中 SourceStream.ReadBuffer(Buffer^, Count); //将原始图像流保存至 DestStream流中 DestStream.WriteBuffer(Buffer^, Count); DestStream.Position := 0;//复位流指针 //从 DestStream流中载入原始图像流 Bmp.LoadFromStream(DestStream); finally FreeMem(Buffer); DestStream.Free; end; end;
procedure ScreenCap(LeftPos,TopPos,
RightPos,BottomPos:integer);
var
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
begin
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY','','',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
end;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var count:integer;
DestStream:tmemorystream;
sourcestream:TCompressionStream;
begin screencap(xpos,ypos,screen.Width,screen.Height);
bmpstream.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\source.dat');
image1.Picture.Bitmap.LoadFromStream(bmpstream);
Count:=bmpstream.Size;
DestStream:=TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(cldefault, DestStream);
try
bmpStream.SaveToStream(SourceStream);
SourceStream.Free;
bmpstream.Clear;
bmpstream.WriteBuffer(Count, SizeOf(Count));
bmpstream.CopyFrom(DestStream, 0);
// jy.CopyFrom(DestStream, 0);
finally
deststream.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\yasuo.dat');
DestStream.Free;
end;
//deststream.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\dest.dat);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//deststream:=tmemorystream.Create;
bmpstream:=tmemorystream.Create;
jy:=tmemorystream.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bmpstream.Destroy;
//deststream.destory;
end;procedure TForm1.Button2Click(Sender: TObject);
var CompressedStream: TFileStream;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
//以文件流的只读方式打开自定义的压缩格式文件
CompressedStream := TFileStream.Create('E:\Documents and Settings\shenhong\桌面\新建文件夹\yasuo.dat', fmOpenRead);
//CompressedStream.Create();
Try
//将被压缩的图像流进行解压缩
UnCompressBitmap(CompressedStream, Bmp);
//将原始图像流还原为指定的 BMP文件
Bmp.SaveToFile('E:\Documents and Settings\shenhong\桌面\新建文件夹\jieyasuo.dat' );
image2.Picture.Bitmap:=bmp;
image2.Refresh;
finally
Bmp.Free;
CompressedStream.Free;
end;
end;
94K
本来是做的一个屏幕抓取,抓下来的大小是3M,转换为jpeg压缩之后是94K,用zlib压缩后是65K
所以打算用zlib,但是我解压缩之后发现用image显示的图象是黑色的图象,但是解压缩之后文件的大小和以前的一样,不知道是什么原因.有人帮忙吗?谢谢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货