我用Image控件显示一组用photoshop转换来的.jpg文件时,图片非常的花,而且有错位,基本看不清楚。有个别图片完全不能显示,并且报错为:Access violation at address 402672A1 in module 'vcljpg70.bpl'.write of address 0AA91000. 
这组图片用 Microsoft Office Picture Manager 显示正常,Photoshop显示正常。但是用win2000自带的画图工具显示没有图像,用xp的画图工具可以正常显示。用IE6.0无法显示。

解决方案 »

  1.   

    没遇到过这种情况,显示jpg格式的图片我试过,好像没问题的呀
      

  2.   

    cyblueboy83(爱情白痴—电脑迷) :
      我的Timage控件打开一般的jpg图片也没有问题,只是这些图片有问题。不知道为什么!
      

  3.   

    我所有用image显示的图片都是用photoshop压缩的jpg文件
      

  4.   

    potoshop转出来jpg的格式好像有点和标准的不一样,我在画图板中打开后另存就对了
      

  5.   

    SydPink(Miss Syd.Barrett):加上Jpeg单元的引用,还是不行。sxqwhxq(步青云):我遇到的是用photoshop扫描然后转存的图像,如果是一般的图像压缩,也不存在这样的问题。
     jfet(jfet):我感觉也不大一样。可惜我的这组图片,win2000画图工具根本不认,提示格式不对!但winxp的画图工具却没有问题。
      

  6.   

    我找到不能显示的原因了:我的那组图片的格式是JPG格式,但是色彩空间是CMYK模式的,delphi7.0和quickrep的图形控件TImage、TQRImage均不支持CMYK模式的JPG图片。我试了GraphicEx9.9,由于说明文档比较简单或者我水平有限,至今没有找到如何处理这种格式转换。我搜索了大富翁以前的资料,看到有两种模式的转换算法,但是不知道如何使用。请问有没有什么好的解决办法?
    另外还有两个问题,希望大家能够帮忙回答,分数不够我再加:
    1.界面在我这里所有的机器都能显示正常,但是到客户那里就不行了。大概有两个界面上的控件显示得乱七八糟。我的配置是win2000 adv Sever,客户那里是xp。我的显示器是CRT显示器,支持分辨率1024*768。客户的显示器是液晶显示器,使用1280*1024分辨率。后来客户告诉我他设置了最高像素的大尺寸,如果设置成正常情况,就没有问题。我现在还没搞明白这个设置在那里。请问在这个设置下如何正常显示界面?
    2.我使用QuickRep做报表,客户说有个字段不能显示完全显示,因为文字超出了格子。我写程序让文字自己折行。在printbefore事件中写代码,根据字符串的长度决定在什么位置插入13#和10#。因为一行显示的话要居中,多行显示的话,不得不把QRLable控件高度调大,结果在客户那里打印出来字符全部往上面跑了,但是在我这里显示正常。没有自己写代码显示的时候没有这种字符全往上跑得问题。请问这是什么原因?请各位大虾帮帮忙。如果分不够我再加!
      

  7.   

    用ImageEN控件就可以了
    或者我有CMYKimg控件 不过是for D4的
    要的话跟我联系 
    你在做什么程序 可以交流一下 qq:17675455
      

  8.   

    兄弟这样解决,你的图片用画图板打开,然后再另存就能打开了,这种用Photoshop压缩的图片在IE中显示有时也不正常。
      

  9.   

    to:nccxl(小猪的狗熊) 
     to:jfet(jfet) 
        谢谢两位的回答,这两种方法我知道能用.但是关键是我想知道怎么用delphi编程实现.用控件也行.
      

  10.   

    在一篇文章上看过,说JPG文件有个标志头,只要从这个标志头开始读取就行。你的问题不知道能否用这样的方法解决。
      

  11.   

    to:yxzake(白河)
        我已经找到图片不能识别的原因,我的那组图片的格式是JPG格式,但是色彩空间是CMYK模式的,delphi7.0和quickrep的图形控件TImage、TQRImage均不支持CMYK模式的JPG图片。以往的大富翁离线资料里有人给出过这两种模式的转换问题。但是给出的函数只是对每个象素的转换,我不知道怎么从jpg格式文件中读取图片的每个象素。如果知道文件的读取格式,就可以进行转换了。或者有什么控件能做也行。photoshop可以转换,但是我需要在程序中调用。
    to:wtg476(起飞)
        如果photoshop的图片是RGB模式的,delphi可以支持,但是CMYK模式的不支持,郁闷!微软的.net倒是支持!唉!
      

  12.   

    Delphi的TImage是可扩展的,你可以写自己的TGraphic类来支持新的格式,并且可以注册到TImage中。
    JPEG、GIF、PNG之类的支持都是这样扩展出来的,而TImage不用做任何修改。
    如果你不想做这种扩展支持,可以把先JPEG转换到Bitmap中:
    ABitmap.Assign(AJPEGImage.Graphic);
    然后对这个Bitmap做CMYK->RGB转换。
    之后再AImage.Picture.Bitmap.Assign(ABitmap);
    就好了。
      

  13.   

    to: DelphiGuy() 
        谢谢你的回答,请问ABitmap和AJPEGImage是哪个类?如何在Bitmap做CMYK->RGB转换呢?
      

  14.   

    简单点
    你可以先把那张jpg用photoshop打开(最大化)
    然后按住键盘的 printScreen 键 把图片打印下来
    再新建一个把copy下来的图片粘贴进来,然后另存为jpg
    应该就可以了
    然后用Timage 就可以显示了
      

  15.   

    to hksl(zzj) :
      谢谢你的回答,我想知道如何在程序中这样做。
      

  16.   

    var
      ABitmap: TBitmap;
      AJPEGImage: TJPEGImage;  // 单元头部分要加入uses JPEG;CMYK->CMY:
    C = (C * (1 - K) + K)
    M = (M * (1 - K) + K)
    Y = (Y * (1 - K) + K)
    CMY->RGB:
    R = (1 - C) * 255
    G = (1 - M) * 255
    B = (1 - Y) * 255
    为了转换,你必须知道文件究竟是三色CMY还是四色CMYK。
      

  17.   

    to: DelphiGuy() 
        很感谢你的回答,我也曾经看到过你说的这个转换公式,但是我不理解这个公式的R、G、B和C、M、Y、K都是怎么和图片文件关联起来的?就是说,我把一个CMYK图片文件如何读进来,然后如何运用这个转换公式进行转换?比如说把CMYK图片读到TGraphic类的对象中,是按字节逐个转换的吗?还请你告知
      

  18.   

    RGB、CMYK都是象素的值,转换就是根据这些值进行的。
    如果你要在TBitmap的框架下转换,就使用TBitmap.ScanLine属性。
    否则就使用GlobalLock锁定一个Bitmap的Handle,获取指向Bitmap数据的指针,然后就可以根据Bitmap的格式(1/4/8/24bit,还有非标准的16/32bit)进行转换了。
      

  19.   

    to: DelphiGuy() 
      谢谢,我试了试,有几个问题不很明了,还望你进一步解答。
      1.在TBitmap的框架下转换,使用TBitmap.ScanLine的时候,每个像素占几个字节?我把图像PixelFormat设置成pf24bit,应该是一个图像占3个字节,为什么以下代码会不对呢?
        for y := 0 to ABitMap.Height -1 do
        begin
          P := ABitMap.ScanLine[y];
          m:=0;
          for x := 0 to ABitMap.Width -1 do
          begin
            b:=p[x];
            g:=p[x+1];
            r:=p[x+2];
             if b<>m showmessage('erro')  
            m:=p[x+3];
          end;
        end;
        
        如果一个像素3个字节并且分别是bgr三色的话,b应该和m的上一个值相同的(第一轮循环除外),为什么我的会不同呢?即使我使用RGB色彩空间的图片测试仍然不同。
       
        2.我需要将cmyk-〉RGB,但是我把文件读到TBitmap中,如何判断一个像素中哪个值是C、M、Y、K?
        3.如何判断一个图片文件的色彩空间是cmyk还是rgb?
        
        期盼你的回答,非常感谢!
      

  20.   

    b := p[x * 3];
    g := p[x * 3 + 1];
    r := p[x * 3 + 2];
      

  21.   

    to: DelphiGuy() 
        你说的很对,是少乘了一个3,但是中间的那段循环代码我是从delphi的ScanLine帮助中拷贝的,不知道为什么会出现这种问题.
        但是新的问题是,我在以下代码中用TBitmap把jpg文件读入
        AJPEGImage:=TJPEGImage.Create;
        AJPEGImage.LoadFromFile(OpenDialog1.FileName);
        ABitmap:=TBitmap.Create;
        ABitmap.Assign(AJPEGImage);
        ABitmap.PixelFormat:= pf24bit;
        
        在ABitmap中我怎么读取像素的CMYK值呢?只有知道每个像素的CMYK值我才能进行用函数转换到RGB
      

  22.   

    我的理解:
    如果这个JPEG使用CMY彩色空间,那么assign到Bitmap中应该是一个24-bit的,CMY对应RGB;
    如果是CMYK彩色空间,那么assign到Bitmap中应该是一个32-bit的,CMYK对应RGBA。
    因为Delphi中的TJPEGImage是使用JPEG 6.0a的源代码,并不支持CMY/CMYK彩色空间,所以它认为解码后的数据是RGB,但是这不影响我们自己转换。
      

  23.   

    我找到不能显示的原因了:我的那组图片的格式是JPG格式,但是色彩空间是CMYK模式的,delphi7.0和quickrep的图形控件TImage、TQRImage均不支持CMYK模式的JPG图片。我试了GraphicEx9.9,由于说明文档比较简单或者我水平有限,至今没有找到如何处理这种格式转换。
    --------------------------------------------------------------
    第三方控件ImageEn可以解决你的问题
      

  24.   

    另外还有两个问题,希望大家能够帮忙回答,分数不够我再加:
    1.界面在我这里所有的机器都能显示正常,但是到客户那里就不行了。大概有两个界面上的控件显示得乱七八糟。我的配置是win2000 adv Sever,客户那里是xp。我的显示器是CRT显示器,支持分辨率1024*768。客户的显示器是液晶显示器,使用1280*1024分辨率。后来客户告诉我他设置了最高像素的大尺寸,如果设置成正常情况,就没有问题。我现在还没搞明白这个设置在那里。请问在这个设置下如何正常显示界面?
    2.我使用QuickRep做报表,客户说有个字段不能显示完全显示,因为文字超出了格子。我写程序让文字自己折行。在printbefore事件中写代码,根据字符串的长度决定在什么位置插入13#和10#。因为一行显示的话要居中,多行显示的话,不得不把QRLable控件高度调大,结果在客户那里打印出来字符全部往上面跑了,但是在我这里显示正常。没有自己写代码显示的时候没有这种字符全往上跑得问题。请问这是什么原因?
    ------------------------------
    第一个问题,就让客户使用1024*768分辨率就可以
    第二个问题没看明白,你想解决的是折行的问题呢还是显示的问题呢?
      

  25.   

    to: DelphiGuy() :
        我用TBitmap控件将图片assign到Bitmap中,判断PixelFormat属性是一个24-bit的.照你的意思说,应该是CMY空间.据说bitmap中RGB值是依次按照BGR存放的,根据CMY->RGB的依次对应关系,我按照YMC的次序依次把数据读到出来,并按照你给出的
       CMY->RGB:
       R = (1 - C) * 255
       G = (1 - M) * 255
       B = (1 - Y) * 255
       转换公式进行转换,发现转换过后图像依然不正常。你觉得是怎么回事呢?
       
       从图像上看我感觉不应该是单纯的像素对像素的色彩空间转换,因为本来在图片的右面的一些字,很模糊的跑到了左面,如果单纯转换像素的色彩空间,肯定不行的。
        你能给我一个邮箱么?我可以把图片发给你看看。
        谢谢!
    to: hellolongbin(一个人[年长资深少男][看贴先看错别字]) 
        第三方控件ImageEn我曾经下载过2.1.9的版本,但是我不知道如何使用,你能否告知一二,或者给一些帮助的信息给我看看。谢谢!
      

  26.   

    delphiguy at programmer.net
    图片最好小一点。
      

  27.   

    to: hellolongbin(一个人[年长资深少男][看贴先看错别字]) 
        谢谢你,我已经看到他的帮助文档了,原来没有发现。
      

  28.   

    to: hellolongbin(一个人[年长资深少男][看贴先看错别字]) 
      我说的另外两个问题,第一个问题,我不能强迫让客户使用我开发环境中的分辨率.在写界面的时候,我特意做了界面分辨率支持,能支持各种分辨率,我在其他的CRT显示器的电脑上都试过了,各种分辨率下显示都正常.但是客户的是液晶的显示器,我不知道是不是液晶的和CRT的显示器的区别导致了在客户说的"
    最高像素的大尺寸"显示模式下不支持.
      我现在还没有搞明白"最高像素的大尺寸"是怎么显示的.
      第二个问题,本来是折行的问题,我自己通过判断字符数,然后加入换行符解决了,但问题是在我这里显示正常,在客户那里显示就不正常,字符和线都跑得乱七八糟.我不知道这种情况是什么原因导致的.
      

  29.   

    to  DelphiGuy():
      你说的对,是由于字体的原因.在"显示属性"面板中点击"高级"弹出的"默认监视器"或分辨率对话框的"常规"选项中,有一个"显示"栏目,可以选择大尺寸或大字体(125%常规大小,120像素/英寸),正常尺寸或小字体(常规大小,96像素/英寸).
      请问这种问题如何解决呢?
      

  30.   

    需要运行时自己调整,在不同的DPI下字体的象素大小是不一样的,比如12磅字体,在72DPI下它的高度是12 pixels,96DPI下就是16 pixels了。
    另一种方法就是直接设置Font.Height,当它为正的时候指出的是字体的高度象素值,为负时,Font.Size指出的是字体的磅值(这个是默认的)。
      

  31.   

    to  DelphiGuy() :
       谢谢你的指点,这个问题我已经解决了.我原来把字体设成自动更改的,出现混乱的原因,不是字体大小的原因.是因为我在调整分别率的时候,让窗体的初始化大小固定了.当使用大字体模式显示的时候,delphi会自动把字体和窗体中的控件改变大小.这和固定的窗体冲突了.虽然不是你说的原因,但是很感谢你给我的提示,终于解决了这个困惑已久的问题.相应的分值到结贴的时候我会给你加上。
      
      CMYK图形显示的问题,我已经解决了,我自己写的算法总是不对,不过最后用了ImageEn控件,好在它带有英文的帮助,原来我就尝试使用这个控件,但当时没有找到帮助。不过我还是希望知道具体的关于CMYK显示及转换算法的问题。
      
      同时也谢谢 5201314() 、hellolongbin(一个人[年长资深少男]) 及其他热心朋友的支持。  现在还有最后一个问题期待解决。就是当我在printbefore事件中写代码控制换行的时候,在我机器上显示的正常,为什么在客户那里显示不正常。希望大家多多帮忙。  我还有个贴的地址,到结贴的时候大家也到这里领分。         http://community.csdn.net/Expert/TopicView.asp?id=4344111