如何在delphi中制定好一个新的图片格式(非公用的图形格式如.jpg,.bmp).
即,我按照什么样的游戏规则在delphi中开发一种新的图象格式.以便于使用我另
用delphi开发的工具浏览它.
   十万火急!

解决方案 »

  1.   

    多谢killkillkill
    不过还是跟我想的有些出入!这样讲吧!我要做一个图片浏览器,除了能显示公用的图片格式(如.bmp,.jpg),
    还可以支持用户自定义的图片格式(比方说后缀名为.ski).在delphi中我们可以通过两种方式来辨别图片格式:
    1.辨别图片文件头
        我们知道,在delphi中,我们可以通过读文件头(如.bmp文件头是bm,jpeg文件头是)
      而用户自定义的文件头是Sk.
      
      这种情况下,我可以辨认出文件头,组件使用的容器是addtional里的Component:Image
      但他只支持对公用图片格式的支持.不能显示自定义的图片格式. 
      我应该使用那个类:Tgraphic,Tpicture,TgraphicControl...
      
    或许是我的编程思路不对,忘大家不吝执教.
    只要有思路就请提出.我现在最缺的是能解决这个问题的可行性思路.
    望各位大侠指点迷津!
      

  2.   

    你可以从Timage类继承再自己做一个组件来支持你的格式
      

  3.   

    控件从TImage继承
    重载LoadFromFile或自定义一个如LoadFromMyFile
    在函数中先判断文件的类型,可以通过扩展名或文件头
    如果是标准图象文件则调用原来的LoadFromFile
    如果是你自己定义的图象文件则解码(不要说你不会),然后存成BMP文件,再调用原来的LoadFromFile,当然也可以把解码后的图象直接画在TImage的画布上
      

  4.   

    定义图像格式和开发工具有关系?FT...Delphi中的图像解析类从TGraphic派生
      

  5.   

    谢谢各位的支持!
        我觉得 galeboy(狂风) 比较接近我的答案.
        但是,这个自定义的图像格式是由第三方提供的,怎么解码?
        "galeboy(狂风) ":如果是你自己定义的图象文件则解码(不要说你不会)
                        请告诉我,我还真不知道.我现在的做法跟galeboy(狂风)很相似 ,不过利用的是Tpicture类.
    Tpicture支持对用户定义的图像格式.(应该也可以用Timage的picture属性,没试过)
    主要通过函数
    mmm(Tpicture对象).RegisterFileFormat('ski'[用户定义的图像格式],ski files'[图像格式的叙述],TskiImage[定义图像格式的类]);[就可以使用用户定义的图像类了.我下面用jpeg试做了一个测试案例,成功了]
    但是由于TskiImage是由第三方开发的,我没有.怎么解决?能直接使用图像解码吗?
        引用"galeboy(狂风) ":如果是你自己定义的图象文件则解码
    如果不行,有其他办法吗?急求解决方案,大量分提供测试案例:
    1.
    //定义了一个函数GraphicToBitmap,他是将该自定义的图像格式转成.bmp格式.
    function GraphicToBitmap(P:TPicture):TBitmap;
    begin
    Result :=TBitmap.Create;
    with Result do
    begin
    Width :=P.Width;
    Height :=P.Height;
    Canvas.Draw(0,0,P.Graphic);
    end;
    end;2.该过程定义了对jpeg文件(供测试)的图形格式的辨认
     如果是jpeg,还应该在前面声明使用:uses jpeg,就可以了
    procedure TForm1.Button1Click(Sender: TObject);
    var
    sss:Tbitmap;
    mmm:Tpicture;
    begin
    sss:=Tbitmap.Create;
    mmm:=Tpicture.Create;
    mmm.RegisterFileFormat('jpg','Jpeg files',TJpegImage);
    mmm.LoadFromFile('C:\WINDOWS\SYSTEM\IMAGES\Bgvisa.jpg');
    sss:=GraphicToBitmap(mmm);
    sss.SaveToFile('D:\100.bmp');
    sss.Free;
    mmm.Free;
    application.Terminate;
    end;
      

  6.   

    http://expert.csdn.net/Expert/TopicView1.asp?id=1849793
      

  7.   

    请参见这个网址.强烈推荐.我也是在网上找到的!
    http://lianwm.3322.net/希望大家共同进步,视野更宽广些!
      

  8.   

    skygreen2001(pupu) :别提那个破网站了,几千年不变,源码还要收钱。
      

  9.   

    同意!看起来很高深!可我用不上!对ehom(?!)
    您的图像解析类对一切自定义图像都管用吗?
    我怎么用不对呀!
    不过,还是谢谢您,分就给您了!
    但还是希望您能帮我解决解决! 
      

  10.   

    对ehom(?!)
    您的图像解析类对一切自定义图像都管用吗?
    我怎么用不对呀!
    不过,还是谢谢您,分就给您了!
    但还是希望您能帮我解决解决! 
      

  11.   

    当然不是,就像TBitmap针对BMP,TJPEGImage针对JPEG,TGIFImgae针对GIFTRASGraphic不过是针对RAS的类~~~自定义文件格式和写程序没有关系?只能告诉你如何写程序去解析某种特定格式,如此而已
      

  12.   

    刚看过您和launce的争执是不是这些格式都有同样的规则.
    我看您的程序是读文件头的!这个文件头是不是只针对ras的文件头.
    其他的,文件头的读写是不一样的,对吗?
      

  13.   

    当然没有相同的规则!如果规则相同不就成了一种图像格式?就算同一种后缀的图像文件其实质也可能不同~~~不同的文件格式当然有不同的文件格式,不过多数图像格式都由一描述性质的头和数据区(可是包括像素信息,调色板信息和其它附加信息等)组成,所以对于多数图像格式而言可以用类似的方法编写图像解析组件(比如将头数据复制到一个记录类型中,记录中的各成员就表示Width,Height,Depth等信息,还有数据的压缩方式很多时候也是那几种),编写各种图像的解析组件需要参考各种图像的格式的描述文档和各种压缩方式如(LZW,RLE)的编码解码
      

  14.   

    您有邮箱吗?我给您一种用户自定义的图像格式的图片(只有图片),
    您看能进行它的解析,以将它转成一般的.bmp格式我还发现tpicture直接就可以加载.ras文件并转换成.bmp文件
    定义的对象直接就可以使用loadfromfile:  .ras文件还有我使用了您的图像解析组件中的两个函数:
    procedure LoadFromStream(Stream: TStream); override;
    procedure SaveToStream(Stream: TStream); override;
    发现并未用到您的两个函数.我的使用如下implementation
    //uses  rasfile(我将您的图像解析类放在这个rasfile.pas文件里了,后来发现没有使用的您的两个方法,就注释掉了);
    {$R *.dfm}function GraphicToBitmap(P:TPicture):TBitmap;
    begin
    Result :=TBitmap.Create;
    with Result do
    begin
    Width :=P.Width;
    Height :=P.Height;
    Canvas.Draw(0,0,P.Graphic);
    end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    sss:Tbitmap;
    mmm:TPicture;
    begin
    sss:=Tbitmap.Create;
    mmm:=TPicture.Create;
    //mmm.RegisterFileFormat('ras','Sun RAS',TRASGraphic);[可以注释掉]
    mmm.LoadFromFile('C:\WINDOWS\Desktop\txt\119.ras');
    sss:=GraphicToBitmap(mmm);
    sss.SaveToFile('D:\100.bmp');
    //mmm.SaveToFile('D:\200.ras');[这里可以保存得到200.ras文件]
    sss.Free;
    mmm.Free;
    sss:=Tbitmap.Create;
    mmm:=Tpicture.Create;
    sss.LoadFromFile('C:\WINDOWS\Desktop\txt\120.bmp');
    //mmm.RegisterFileFormat('ras','Sun RAS',TRASGraphic);[可以注释掉]
    mmm.SaveToFile('D:\200.ras');[没有反应,奇怪,前面可以保存,现在就不能保存,即ras可以保存为ras文件,但不能实现从bmp到ras的转换,或者告诉我您的SaveToStream如何使用]sss.Free;
    mmm.Free;
    application.Terminate;
    end;
    end.
      

  15.   

    今天又解决了我的一些疑问.再加给您20分
    您的图像解析工具我用了一下.不明白的是我定义的tpicture类的对象:
    mmm:TPicture;  mmm:=TPicture.Create;  
    //mmm.RegisterFileFormat('ras','Sun  RAS',TRASGraphic);[可以注释掉]  
    mmm.LoadFromFile('C:\WINDOWS\Desktop\txt\119.ras');  
    就调到了您定义的LoadFromStream里了,但却不能直接调用您的
    LoadFromStream和SaveToStream方法.
      

  16.   

    "我还发现tpicture直接就可以加载.ras文件并转换成.bmp文件
    定义的对象直接就可以使用loadfromfile:  .ras文件"反问:"否则TPicture.RegisterFileFormat('RAS', 'Sun RAS', TRASGraphic);还有什么作用?""还有我使用了您的图像解析组件中的两个函数:
    procedure LoadFromStream(Stream: TStream); override;
    procedure SaveToStream(Stream: TStream); override;
    发现并未用到您的两个函数."答:"因为TGraphic.LoadFromFile/TGraphic.SaveToFile中已经实现了由文件名读取数据到流的/将流中的数据写入到对应文件的功能,无特殊需要这里可以不用重载。"关于RegisterFileFormat的作用,为什么不需要重载LoadFromFile/SaveToFile我已经在那帖中作出可回答~~~请自行思考~~~必要时补充点基础知识或查看相关VCL代码~~~
      

  17.   

    还有,我现在发现,您写的有关ras图像文件解析有问题:1.使用loadfromfile
    mmm.RegisterFileFormat('ras','Sun RAS',TRASGraphic);
    mmm.LoadFromFile('C:\WINDOWS\Desktop\txt\119.ras');
    sss:=GraphicToBitmap(mmm);
    sss.SaveToFile('D:\100.bmp');
    但是保存的100.bmp文件发生变色(由黄色变成了绿色)2.使用savetofile 
    sss:=Tbitmap.Create;
    mmm:=Tpicture.Create;
    sss.LoadFromFile('C:\WINDOWS\Desktop\txt\120.bmp');
    mmm.RegisterFileFormat('ras','Sun RAS',TRASGraphic);[可以注释掉]
    mmm.SaveToFile('D:\200.ras');[没有反应,没有任何的200.ras文件生成,
    现在就不能保存,即ras可以保存为ras文件,但不能实现从bmp到ras的转换]
      

  18.   

    关于RegisterFileFormat的作用,为什么不需要重载LoadFromFile/SaveToFile我已经在那帖中作出可回答~~~
    我测试过了,的确如您所说,当我重建一个新的工程,没有导入rasgraphic类时,就没有效.多谢!
      

  19.   

    "由黄色变成了绿色",你是指和ACDSEE查看效果比?实际上这是ACDSEE的BUG~~~"mmm.SaveToFile('D:\200.ras');"???用mmm.SaveToFile('D:\200.jpg');会有JPG文件生产吗?实际只会生成一个用jpg做后缀,但实际上是BMP位图的文件,关于这个问题原因去看看TPicture.SaveToFile!要生成特定格式的图像文件只能用特定类的实例,如JPEGImage.SaveToFile~~~RegisterFileFormat?在这里调用RegisterFileFormat有意义吗???如果你只是想找特定格式的解析类,不应该用我这个,我这个只是一小段不完整的代码,很多东西没有加上去,只是描述了一点编写这类代码的一点过程和技巧!怎么写还是要靠自己~~~从头到尾,你对很多东西都还没理解,自己先去思考,会有答案的~~~
      

  20.   

    Ehom说得对,你定义的文件格式还得靠你自己,压缩方法简单点我看用RLE就差不多了,LZW不但有版权,而且还麻烦,咳....