線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2515
推到 Plurk!
推到 Facebook!

FireMonkey 不能加载 RGB656 格式的 BMP

答題得分者是:aftcast
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-11-01 14:33:40 IP:183.15.xxx.xxx 訂閱
RGB656 格式,也就是 16位的 BMP。这种 BMP 文件,用 VCL 的 TImage 加载显示,没有问题。

在 Delphi XE3 底下,FireMonkey TImage 加载显示,也没问题。

在 Delphi XE7 底下,FireMonkey 不管目标平台是 windows 还是 Android,采用 TImage 或者是采用 TBitmap,加载 RBG656 格式的 BMP 文件,都弹出错误提示:加载失败。但同样的代码,加载32位的BMP文件就没有问题。

不知道这个该如何解决?
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-11-01 15:06:43 IP:66.249.xxx.xxx 訂閱
載之前先將rgb565轉rgb888。網路上可找到轉換的程式。我想這樣最快。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-11-01 15:35:37 IP:66.249.xxx.xxx 訂閱
 剛幫你又查了文檔,或許你可以將pixel format設為你要的再load看看。
http://docwiki.embarcadero.com/Libraries/XE6/en/FMX.Types.TPixelFormat
BGR_565
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-11-01 16:23:40 IP:183.15.xxx.xxx 訂閱
非常感谢!

在 FireMonkey 底下,TBitmap.PixelFormat 是 Read only 的,无法更改其设置。

===================引 用 aftcast 文 章===================
剛幫你又查了文檔,或許你可以將pixel format設為你要的再load看看。
http://docwiki.embarcadero.com/Libraries/XE6/en/FMX.Types.TPixelFormat
BGR_565   
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-11-01 20:22:59 IP:183.15.xxx.xxx 訂閱
问题原因找到了。

之前的那个 RGB565 的 BMP 档案,它的档案头,70个 Byte 是通过将 PhotoShop 里面的图保存为 16Bit Bitmap 获得的。这个 Bitmap 档案,可以在 VCL 下通过 TBitmap.LoadFromFile 打开;也可以在 XE3 的 FireMonkey 底下,通过 TBitmap.LoadFromFile 打开。

但这个档案在 XE7 底下的 FireMonkey 中的 TBitmap.LoadFromFile 无法打开。追踪代码,发现 FireMonkey 在判断档案文件的头时直接退出了。

在 XE7 底下,我用 VCL 的 TBitmap.LoadFromFile 打开这个档案,然后再 SaveToFile 保存为另外一个档案,然后对比两个档案的头,有一些不同。这个新的档案,在 XE7 底下,可以用 FireMonkey 的 TBitmap 打开。
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-11-01 21:47:09 IP:66.249.xxx.xxx 訂閱
謝謝你的分享! 不過,雖然了解問題所在,但很想知道你的解決方案為何?

自己轉檔再load嗎?

===================引 用 pcplayer99 文 章===================
问题原因找到了。

之前的那个 RGB565 的 BMP 档案,它的档案头,70个 Byte 是通过将 PhotoShop 里面的图保存为 16Bit Bitmap 获得的。这个 Bitmap 档案,可以在 VCL 下通过 TBitmap.LoadFromFile 打开;也可以在 XE3 的 FireMonkey 底下,通过 TBitmap.LoadFromFile 打开。

但这个档案在 XE7 底下的 FireMonkey 中的 TBitmap.LoadFromFile 无法打开。追踪代码,发现 FireMonkey 在判断档案文件的头时直接退出了。

在 XE7 底下,我用 VCL 的 TBitmap.LoadFromFile 打开这个档案,然后再 SaveToFile 保存为另外一个档案,然后对比两个档案的头,有一些不同。这个新的档案,在 XE7 底下,可以用 FireMonkey 的 TBitmap 打开。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-11-02 23:53:44 IP:183.15.xxx.xxx 訂閱
 XE7 Firemonkey 无法打开的 BMP 图,是 PhotoShop 保存的 RGB565 格式的。无法打开的原因是它的头不太对。但这个档案在其它工具里能打开,也能用 VCL 的 TImage 或者 TBitmap 打开。

因此,解决办法是转档。方法有2:

1. 用 VCL 的 TBitmap 打开,然后再 Bitmap.SaveToFile 这样保存下来的档案,FireMonkey 可以打开。

2. 找一个正确的相同分辨率的 RGB565 格式的档案(正确是指 Firemonkey 能打开的那种),读取它的前面70个Byte,然后用 TMemoryStream 调入有问题的档案,将这70个 Byte 覆盖到前面,然后 MemoryStream.SaveToFile 的结果档案,Firemonkey 也能打开。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-11-03 00:23:37 IP:183.15.xxx.xxx 訂閱
如果不想转档再Load,可以直接在 RAM 里面操作:

MemoryStream.LoadFromFile 调入有问题的文件,然后直接将前面70个字节用正确的覆盖掉:

MemoryStream.Position := 0;
MemoryStream.Write(MyHead, 70);

Bitmap.LoadFromStream(MemoryStream);
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-11-03 00:25:29 IP:66.249.xxx.xxx 訂閱
謝謝分享!;-)

===================引 用 pcplayer99 文 章===================
如果不想转档再Load,可以直接在 RAM 里面操作:

MemoryStream.LoadFromFile 调入有问题的文件,然后直接将前面70个字节用正确的覆盖掉:

MemoryStream.Position := 0;
MemoryStream.Write(MyHead, 70);

Bitmap.LoadFromStream(MemoryStream);
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-11-21 21:24:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!