我用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无法显示。
这组图片用 Microsoft Office Picture Manager 显示正常,Photoshop显示正常。但是用win2000自带的画图工具显示没有图像,用xp的画图工具可以正常显示。用IE6.0无法显示。
解决方案 »
- 请问MessageBox的图标存放在哪儿?我想使用那个叹号,问号,差号。
- 广州短期高薪急聘Delphi程序员,要求水平高,兼职亦可!
- 关于Tclientsocket的错误?简单问题,欢迎近来讨论!
- socket连接问题,请高手一定要指教
- 如何从outlook中导入地址簿的数据
- 怎么退出
- 请教一个FORM关闭的问题
- Delphi5怎样从怎样从URL获得HTML代码?
- DbGrid1.columns[0].buttonStyle := cbsEllipsis; 能在DbGrid1显示按钮吗?
- 关于安装软件的小问题
- ...高分请教dbgrid打印的问题,请大家指点,急呀,8号就要。。。。。。
- delphi 字符问题
我的Timage控件打开一般的jpg图片也没有问题,只是这些图片有问题。不知道为什么!
jfet(jfet):我感觉也不大一样。可惜我的这组图片,win2000画图工具根本不认,提示格式不对!但winxp的画图工具却没有问题。
另外还有两个问题,希望大家能够帮忙回答,分数不够我再加:
1.界面在我这里所有的机器都能显示正常,但是到客户那里就不行了。大概有两个界面上的控件显示得乱七八糟。我的配置是win2000 adv Sever,客户那里是xp。我的显示器是CRT显示器,支持分辨率1024*768。客户的显示器是液晶显示器,使用1280*1024分辨率。后来客户告诉我他设置了最高像素的大尺寸,如果设置成正常情况,就没有问题。我现在还没搞明白这个设置在那里。请问在这个设置下如何正常显示界面?
2.我使用QuickRep做报表,客户说有个字段不能显示完全显示,因为文字超出了格子。我写程序让文字自己折行。在printbefore事件中写代码,根据字符串的长度决定在什么位置插入13#和10#。因为一行显示的话要居中,多行显示的话,不得不把QRLable控件高度调大,结果在客户那里打印出来字符全部往上面跑了,但是在我这里显示正常。没有自己写代码显示的时候没有这种字符全往上跑得问题。请问这是什么原因?请各位大虾帮帮忙。如果分不够我再加!
或者我有CMYKimg控件 不过是for D4的
要的话跟我联系
你在做什么程序 可以交流一下 qq:17675455
to:jfet(jfet)
谢谢两位的回答,这两种方法我知道能用.但是关键是我想知道怎么用delphi编程实现.用控件也行.
我已经找到图片不能识别的原因,我的那组图片的格式是JPG格式,但是色彩空间是CMYK模式的,delphi7.0和quickrep的图形控件TImage、TQRImage均不支持CMYK模式的JPG图片。以往的大富翁离线资料里有人给出过这两种模式的转换问题。但是给出的函数只是对每个象素的转换,我不知道怎么从jpg格式文件中读取图片的每个象素。如果知道文件的读取格式,就可以进行转换了。或者有什么控件能做也行。photoshop可以转换,但是我需要在程序中调用。
to:wtg476(起飞)
如果photoshop的图片是RGB模式的,delphi可以支持,但是CMYK模式的不支持,郁闷!微软的.net倒是支持!唉!
JPEG、GIF、PNG之类的支持都是这样扩展出来的,而TImage不用做任何修改。
如果你不想做这种扩展支持,可以把先JPEG转换到Bitmap中:
ABitmap.Assign(AJPEGImage.Graphic);
然后对这个Bitmap做CMYK->RGB转换。
之后再AImage.Picture.Bitmap.Assign(ABitmap);
就好了。
谢谢你的回答,请问ABitmap和AJPEGImage是哪个类?如何在Bitmap做CMYK->RGB转换呢?
你可以先把那张jpg用photoshop打开(最大化)
然后按住键盘的 printScreen 键 把图片打印下来
再新建一个把copy下来的图片粘贴进来,然后另存为jpg
应该就可以了
然后用Timage 就可以显示了
谢谢你的回答,我想知道如何在程序中这样做。
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。
很感谢你的回答,我也曾经看到过你说的这个转换公式,但是我不理解这个公式的R、G、B和C、M、Y、K都是怎么和图片文件关联起来的?就是说,我把一个CMYK图片文件如何读进来,然后如何运用这个转换公式进行转换?比如说把CMYK图片读到TGraphic类的对象中,是按字节逐个转换的吗?还请你告知
如果你要在TBitmap的框架下转换,就使用TBitmap.ScanLine属性。
否则就使用GlobalLock锁定一个Bitmap的Handle,获取指向Bitmap数据的指针,然后就可以根据Bitmap的格式(1/4/8/24bit,还有非标准的16/32bit)进行转换了。
谢谢,我试了试,有几个问题不很明了,还望你进一步解答。
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?
期盼你的回答,非常感谢!
g := p[x * 3 + 1];
r := p[x * 3 + 2];
你说的很对,是少乘了一个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
如果这个JPEG使用CMY彩色空间,那么assign到Bitmap中应该是一个24-bit的,CMY对应RGB;
如果是CMYK彩色空间,那么assign到Bitmap中应该是一个32-bit的,CMYK对应RGBA。
因为Delphi中的TJPEGImage是使用JPEG 6.0a的源代码,并不支持CMY/CMYK彩色空间,所以它认为解码后的数据是RGB,但是这不影响我们自己转换。
--------------------------------------------------------------
第三方控件ImageEn可以解决你的问题
1.界面在我这里所有的机器都能显示正常,但是到客户那里就不行了。大概有两个界面上的控件显示得乱七八糟。我的配置是win2000 adv Sever,客户那里是xp。我的显示器是CRT显示器,支持分辨率1024*768。客户的显示器是液晶显示器,使用1280*1024分辨率。后来客户告诉我他设置了最高像素的大尺寸,如果设置成正常情况,就没有问题。我现在还没搞明白这个设置在那里。请问在这个设置下如何正常显示界面?
2.我使用QuickRep做报表,客户说有个字段不能显示完全显示,因为文字超出了格子。我写程序让文字自己折行。在printbefore事件中写代码,根据字符串的长度决定在什么位置插入13#和10#。因为一行显示的话要居中,多行显示的话,不得不把QRLable控件高度调大,结果在客户那里打印出来字符全部往上面跑了,但是在我这里显示正常。没有自己写代码显示的时候没有这种字符全往上跑得问题。请问这是什么原因?
------------------------------
第一个问题,就让客户使用1024*768分辨率就可以
第二个问题没看明白,你想解决的是折行的问题呢还是显示的问题呢?
我用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的版本,但是我不知道如何使用,你能否告知一二,或者给一些帮助的信息给我看看。谢谢!
图片最好小一点。
谢谢你,我已经看到他的帮助文档了,原来没有发现。
我说的另外两个问题,第一个问题,我不能强迫让客户使用我开发环境中的分辨率.在写界面的时候,我特意做了界面分辨率支持,能支持各种分辨率,我在其他的CRT显示器的电脑上都试过了,各种分辨率下显示都正常.但是客户的是液晶的显示器,我不知道是不是液晶的和CRT的显示器的区别导致了在客户说的"
最高像素的大尺寸"显示模式下不支持.
我现在还没有搞明白"最高像素的大尺寸"是怎么显示的.
第二个问题,本来是折行的问题,我自己通过判断字符数,然后加入换行符解决了,但问题是在我这里显示正常,在客户那里显示就不正常,字符和线都跑得乱七八糟.我不知道这种情况是什么原因导致的.
你说的对,是由于字体的原因.在"显示属性"面板中点击"高级"弹出的"默认监视器"或分辨率对话框的"常规"选项中,有一个"显示"栏目,可以选择大尺寸或大字体(125%常规大小,120像素/英寸),正常尺寸或小字体(常规大小,96像素/英寸).
请问这种问题如何解决呢?
另一种方法就是直接设置Font.Height,当它为正的时候指出的是字体的高度象素值,为负时,Font.Size指出的是字体的磅值(这个是默认的)。
谢谢你的指点,这个问题我已经解决了.我原来把字体设成自动更改的,出现混乱的原因,不是字体大小的原因.是因为我在调整分别率的时候,让窗体的初始化大小固定了.当使用大字体模式显示的时候,delphi会自动把字体和窗体中的控件改变大小.这和固定的窗体冲突了.虽然不是你说的原因,但是很感谢你给我的提示,终于解决了这个困惑已久的问题.相应的分值到结贴的时候我会给你加上。
CMYK图形显示的问题,我已经解决了,我自己写的算法总是不对,不过最后用了ImageEn控件,好在它带有英文的帮助,原来我就尝试使用这个控件,但当时没有找到帮助。不过我还是希望知道具体的关于CMYK显示及转换算法的问题。
同时也谢谢 5201314() 、hellolongbin(一个人[年长资深少男]) 及其他热心朋友的支持。 现在还有最后一个问题期待解决。就是当我在printbefore事件中写代码控制换行的时候,在我机器上显示的正常,为什么在客户那里显示不正常。希望大家多多帮忙。 我还有个贴的地址,到结贴的时候大家也到这里领分。 http://community.csdn.net/Expert/TopicView.asp?id=4344111