如何自创一种图片格式,将JPG,BMP格式图片转换成自创的图片格式,只可在自己的程序中浏览?(100分)

  • 主题发起人 主题发起人 delphibase
  • 开始时间 开始时间
D

delphibase

Unregistered / Unconfirmed
GUEST, unregistred user!
D5+ACCESS2000,要求:
图片扫描成JPG格式文件,数据库只保存文件路径。
先将JPG批量转换成自创格式,删除JPG文件。
用我的程序才能浏览该图片。程序中无需转换该专用格式,
能直接浏览。因为我现在是先将JPG文件进行加密,存成加密文件,
然后进入程序后解密该JPG文件,存入目录,退出程序时再加密
JPG文件,存成加密文件,删除JPG文件。费时费力!
是否可用流进行操作?
(sayapic个人图片大师即有自己格式http://www.rchan.net,我就想
知道它是如何进行转换的,又如何直接在自己程序中浏览?)
对图片所知甚少,100分不知够不够?

 
为什么没人响应?分太少?
其实我只想对图片文件进行保密,但又不想存入数据库,
至于采用何种办法都可以。
给个指点都行。
 
你的情况跟本就没有必要自定义图像格式。你加密、读出都可以不写文件,直接在内存中操
作。你将图片读出只是为了显示对不对?那在退出时就没有必要再次加密了吧?
 
我有许多JPG格式的图片文件,采用什么办法对它们进行处理,
达到只能用我的程序进行显示,而无法用如ACDSEE等程序进行
显示的目的?
 
是否这个问题本身提的不好,抑或表达不清楚?请高手指点!
 
很简单的
修改文件头即可
比如说修改前100个字节
然后读入的时候通过流修改然后显示
我做的一个员工监控系统就是用这样的方法的.
 
请jingtao大侠详细解答:
如何修改文件头?
在程序中如何用流来显示?(我现在用delphi5帮助中的JPG例子来显示JPG文件)
我对此一无所知,请指点!最好有代码。
 
自定义文件流加密。
 
to delphibase
http://www.csdn.net/develop/Read_Article.asp?Id=13055
jingtao大作。你的问题修改一下文件头就可以了。
to jingtao
wmv格式那个授权你能不能搞定阿?
 
1.自定义文件头
2.重载 savetostream和loadfromstream过程
3.用TPicture.RegisterFileFormat注册你的新图像格式,这样你的图像在用打开图像对话框
时就可以在对话框里显示,还要用Tpicture.RegisterFileFormatRes进行格式注册。
 
const
MyPicFormat: array[0..15] of Byte = ($6A, $69, $6E, $67, $74, $61, $6F, $70, $69, $63, $66, $6F, $72, $6D, $61, $74);//自定义文件头
MyJpegFormat: array[0..15] of Byte = ($FF, $D8, $FF, $E0, $00, $10, $4A, $46, $49, $46, $00, $01, $11, $00, $00, $01);//标准JPEG文件头
//抓取屏幕并且加密后保存
procedure TForm1.My_ScreenSpy;
var
Mybmp:Tbitmap;
Cursorx, Cursory: integer;
dc: hdc;
Mycan: Tcanvas;
R: TRect;
DrawPos: TPoint;
MyCursor: TIcon;
hld: hwnd;
Threadld: dword;
mp: tpoint;
pIconInfo: TIconInfo;
MyJpg:TJPEGImage;
MyStream:TMemoryStream;
//---------------------------------
SDir,SFilename:String;
datetime : TDateTime;
year,month,day,hour,min,sec,msec : word;
//-------------------------
begin
Mybmp := Tbitmap.Create; {建立BMPMAP }
Mycan := TCanvas.Create; {屏幕截取}
Myjpg := TJpegimage.Create;
MyStream:=TMemoryStream.Create;

dc := GetWindowDC(0);
try
Mycan.Handle := dc;
R := Rect(0, 0, screen.Width, screen.Height);
Mybmp.Width := R.Right;
Mybmp.Height := R.Bottom;
Mybmp.Canvas.CopyRect(R, Mycan, R);
finally
releaseDC(0, DC);
end;
Mycan.Handle := 0;
Mycan.Free;

//if DrawCur then {画上鼠标图象}
begin
GetCursorPos(DrawPos);
MyCursor := TIcon.Create;
getcursorpos(mp);
hld := WindowFromPoint(mp);
Threadld := GetWindowThreadProcessId(hld, nil);
AttachThreadInput(GetCurrentThreadId, Threadld, True);
MyCursor.Handle := Getcursor();
AttachThreadInput(GetCurrentThreadId, threadld, False);
GetIconInfo(Mycursor.Handle, pIconInfo);
cursorx := DrawPos.x - round(pIconInfo.xHotspot);
cursory := DrawPos.y - round(pIconInfo.yHotspot);
Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标}
DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象}
DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽}
Mycursor.ReleaseHandle; {释放数组内存}
MyCursor.Free; {释放鼠标指针}
end;

Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
Myjpg.CompressionQuality := 65; {JPG文件压缩百分比设置,数字越大图像越清晰,但数据也越大}
Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
//--------加密----------------------------------
MyStream.Position:=0;
MyStream.WriteBuffer(MyPicFormat,Sizeof(MyPicFormat));
//-------保存-----------------------------------
SDir:=ExtractFilePath(Application.ExeName)+'ScreenPic';
if not DirectoryExists(SDir) then CreateDir(SDir);
datetime:=now;
decodedate(datetime,year,month,day);
decodetime(datetime,hour,min,sec,msec);
SFilename:=SDir+'/'+Format('%.2d-%.2d-%.2d_%.2d%.2d%.2d',[year,month,day,hour,min,sec])+'.scc';
MyStream.SaveToFile(SFilename);

//-------释放-----------------------------------

Myjpg.Free;
Mybmp.Free;
MyStream.Free;

end;

//解密并显示
procedure TForm1.My_ShowPic;
var
MyJpeg:TJPEGImage;
MyFileName:string;
MyStream:TMemoryStream;
begin

if ListBox1.ItemIndex>=0 then
begin
MyJpeg:=TJPEGImage.Create;
MyStream:=TMemoryStream.Create;
try
MyFileName:=ExtractFilePath(Application.ExeName)+'ScreenPic/'+ListBox1.Items.Strings[ListBox1.ItemIndex]+'.scc';
MyStream.LoadFromFile(MyFileName);
MyStream.WriteBuffer(MyJpegFormat,Sizeof(MyJpegFormat));
MyStream.Position:=0;
MyJpeg.LoadFromStream(MyStream);
Image1.Picture.Bitmap.Assign(MyJpeg);
Form2.Image1.Picture.Bitmap.Assign(MyJpeg);
finally
MyJpeg.Free;
MyStream.Free;
end;
end;
end;
 
通过对图象文件加密,程序执行时解密,其他程序就没有办法识别此格式了
 
谢谢参与解答的各位大侠!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部