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

MetaFile轉成JPG檔過程中出現Out of system resources

答題得分者是:GrandRURU
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-06-17 12:41:27 IP:210.61.xxx.xxx 未訂閱
各位前輩大家好:
小弟目前有支程式
其中有個功能是將DataSet的資料匯出Excel後
在將Excel的資料轉換成圖片(存成JPG檔)

在試寫過程中得知 從Excel轉換出來的為T M e t aFile
所以轉換過程大概為T M e t aFile→BMP→JPG
然後有參考以下連結:
delphi.ktop.com.tw/board.php

但在Run的過程中會出現 "Out of system resources." 的錯誤訊息
經Debug後
錯誤是錯在
Bmp.Width := MetaFile.Width;
Bmp.Height := MetaFile.Height;
這兩行上

因為是第一次寫有關圖檔的轉換
所以對這方面不太熟
只能照本宣科的做

不知大大們這問題要如何處理呢?

以下是Code:


[code delphi]
var
JPG: TJPEGImage;
BMP: TBitmap;
M etafile: T M e t afile;
begin
try
//從Excel中轉換出MetaFile檔
//.......
//過程
//.......
//開始轉成圖檔
M etafile := TM etafile.Create;
M etafile.Assign(ClipBoard);
Bmp := TBitmap.Create;
Bmp.Width := M etaFile.Width;
Bmp.Height := M etaFile.Height;
Bmp.Canvas.Draw(0, 0, M etaFile) ;
JPG := TJPEGImage.Create;
JPG.CompressionQuality := 50;
JPG.Assign(Bmp);
JPG.SaveToFile('C:\test.jpg');
finally
JPG.Free;
Bmp.Free;
M etafile.Free;
end;
end;
[/code]

編輯記錄
老大仔 重新編輯於 2013-06-17 12:43:05, 註解 Meta字樣會被改掉 所以加空白‧
老大仔 重新編輯於 2013-06-17 12:44:19, 註解 無‧
老大仔 重新編輯於 2013-06-17 12:44:44, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-06-17 13:37:31 IP:59.120.xxx.xxx 訂閱
請參閱:convert a Bitamp to a emf (Enhanced Metafile)?
===================引 用 老大仔 文 章===================
各位前輩大家好:
小弟目前有支程式
其中有個功能是將DataSet的資料匯出Excel後
在將Excel的資料轉換成圖片(存成JPG檔)

在試寫過程中得知 從Excel轉換出來的為T M e t aFile
所以轉換過程大概為T M e t aFile→BMP→JPG
然後有參考以下連結:
delphi.ktop.com.tw/board.php

但在Run的過程中會出現 "Out of system resources." 的錯誤訊息
經Debug後
錯誤是錯在
Bmp.Width := MetaFile.Width;
Bmp.Height := MetaFile.Height;
這兩行上

因為是第一次寫有關圖檔的轉換
所以對這方面不太熟
只能照本宣科的做

不知大大們這問題要如何處理呢?

以下是Code:


[code delphi]
var
JPG: TJPEGImage;
BMP: TBitmap;
M etafile: T M e t afile;
begin
try
//從Excel中轉換出MetaFile檔
//.......
//過程
//.......
//開始轉成圖檔
M etafile := TM etafile.Create;
M etafile.Assign(ClipBoard);
Bmp := TBitmap.Create;
Bmp.Width := M etaFile.Width;
Bmp.Height := M etaFile.Height;
Bmp.Canvas.Draw(0, 0, M etaFile) ;
JPG := TJPEGImage.Create;
JPG.CompressionQuality := 50;
JPG.Assign(Bmp);
JPG.SaveToFile('C:\test.jpg');
finally
JPG.Free;
Bmp.Free;
M etafile.Free;
end;
end;
[/code]

老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-06-17 17:52:16 IP:210.61.xxx.xxx 未訂閱
GrandRURU 大大:
您給的連結是從BMP轉到EMF
跟我要的功能相反了QQ


GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-06-18 08:39:57 IP:59.120.xxx.xxx 訂閱
沒有寫過Excel to WMF / Clipboard
所以沒辦法完整的實作 (小弟才疏學淺,莫怪)

但還是可以找到一些頭緒:

How to convert WMF to BMP
Creating WMF file format and placing it to clipboard!

實作的範例如下:
[code delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Clipbrd, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{
Usage:
ConvertWMF2BMP('c:\mypic.wmf','c:\mypic.bmp')
}

procedure ConvertWMF2BMP (const WMFFileName, BMPFileName: TFileName) ;
var
MetaFile : TMetafile;
Bitmap : TBitmap;
begin
Metafile := TMetaFile.Create;
Bitmap := TBitmap.Create;
try
MetaFile.LoadFromFile(WMFFileName) ;
with Bitmap do
begin
Height := Metafile.Height;
Width := Metafile.Width;
Canvas.Draw(0, 0, MetaFile) ;
SaveToFile(BMPFileName) ;
end;
finally
Bitmap.Free;
MetaFile.Free;
end;
end;

function bmp2emf(const SourceFileName: TFileName): Boolean;
// Converts a Bitmap to a Enhanced Metafile (*.emf)
var
Metafile: TMetafile;
MetaCanvas: TMetafileCanvas;
Bitmap: TBitmap;
begin
Result := False;
Metafile := TMetaFile.Create;
try
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile(SourceFileName);
Metafile.Height := Bitmap.Height;
Metafile.Width := Bitmap.Width;
MetaCanvas := TMetafileCanvas.Create(Metafile, 0);
try
MetaCanvas.Draw(0, 0, Bitmap);
finally
MetaCanvas.Free;
end;
finally
Bitmap.Free;
end;
Metafile.SaveToFile(ChangeFileExt(SourceFileName, '.emf'));
Result := True;
finally
Metafile.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap : TBitmap;
begin
Bitmap := TBitmap.Create;
if Clipboard.HasFormat(CF_BITMAP) then
begin
Image1.Picture.Bitmap.Assign(Clipboard);
Image1.Picture.SaveToFile('c:\123.bmp') ;
end;
Bitmap.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
bmp2emf('c:\123.bmp');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ConvertWMF2BMP('c:\123.emf','c:\223.bmp');
end;

end.
[/code]


編輯記錄
GrandRURU 重新編輯於 2013-06-18 10:09:33, 註解 無‧
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-06-20 07:31:09 IP:210.61.xxx.xxx 未訂閱
GrandRURU 大大您言重了~
小弟我也是才疏學淺QQ
我也是第一次用這東西
就只能邊摸邊試了XD

謝謝 GrandRURU 大大提供的方式
我後來有試出來
錯誤原因是我在將Excel轉為圖片的這個動作時
應該要選用Bitmap而不是用Picture的方式
假如轉換出來是Picture的話好像就會有問題
但假如用Bitmap就不會有問題
然後接下來就是用TBitmap來接
再轉為JPEG就可以了~
編輯記錄
老大仔 重新編輯於 2013-06-20 07:35:19, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-06-21 13:02:30 IP:59.120.xxx.xxx 訂閱
請問……Excel是怎麼轉成圖片的呢?

===================引 用 老大仔 文 章===================
謝謝 GrandRURU 大大提供的方式
我後來有試出來
錯誤原因是我在將Excel轉為圖片的這個動作時
應該要選用Bitmap而不是用Picture的方式
假如轉換出來是Picture的話好像就會有問題
但假如用Bitmap就不會有問題
然後接下來就是用TBitmap來接
再轉為JPEG就可以了~
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-06-24 07:43:01 IP:210.61.xxx.xxx 未訂閱
回 GrandRURU 大大:
其實我是先照以下連結中的方法二做
tw.myblog.yahoo.com/alice-jca/article
然後又靈機一動
把這些動作錄下來
再自行轉成Delphi的語法 慢幔try
以下是大至轉換內容:

[code delphi]
try
Excel := CreateOleObject('EXCEL.APPLICATION');
//中間過程就不再贅述了
//重點是這句↓
Excel.Selection.CopyPicture(Appearance:=xlScreen, Format:=xlBitmap);
if Clipboard.HasFormat(CF_BITMAP) then
begin
try
if Bmp <> nil then
Bmp := nil;
Bmp := TBitmap.Create;
Bmp.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
JPG := TJPEGImage.Create;
JPG.Assign(Bmp);
JPG.SaveToFile('C:\test.jpg');
ClipBoard.Clear;
finally
JPG.Free;
Bmp.Free;
end;
end;
finally
Excel.Application.DisplayAlerts := False;
Excel.WorkBooks[1].SaveAs(aFileName);
Excel.WorkBooks.Close;
Excel.Quit;
end;
[/code]



===================引 用 GrandRURU 文 章===================
請問……Excel是怎麼轉成圖片的呢?

===================引 用 老大仔 文 章===================
謝謝 GrandRURU 大大提供的方式
我後來有試出來
錯誤原因是我在將Excel轉為圖片的這個動作時
應該要選用Bitmap而不是用Picture的方式
假如轉換出來是Picture的話好像就會有問題
但假如用Bitmap就不會有問題
然後接下來就是用TBitmap來接
再轉為JPEG就可以了~
編輯記錄
老大仔 重新編輯於 2013-06-24 07:43:21, 註解 無‧
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2013-06-24 09:39:29 IP:59.120.xxx.xxx 訂閱
太厲害了!
給你一個讚!

===================引 用 老大仔 文 章===================
GrandRURU 大大:
其實我是先照以下連結中的方法二做
tw.myblog.yahoo.com/alice-jca/article
然後又靈機一動
把這些動作錄下來
再自行轉成Delphi的語法 慢幔try
以下是大至轉換內容:

[code delphi]
try
Excel := CreateOleObject('EXCEL.APPLICATION');
//中間過程就不再贅述了
//重點是這句↓
Excel.Selection.CopyPicture(Appearance:=xlScreen, Format:=xlBitmap);
if Clipboard.HasFormat(CF_BITMAP) then
begin
try
if Bmp <> nil then
Bmp := nil;
Bmp := TBitmap.Create;
Bmp.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
JPG := TJPEGImage.Create;
JPG.Assign(Bmp);
JPG.SaveToFile('C:\test.jpg');
ClipBoard.Clear;
finally
JPG.Free;
Bmp.Free;
end;
end;
finally
Excel.Application.DisplayAlerts := False;
Excel.WorkBooks[1].SaveAs(aFileName);
Excel.WorkBooks.Close;
Excel.Quit;
end;
[/code]



===================引 用 GrandRURU 文 章===================
請問……Excel是怎麼轉成圖片的呢?

===================引 用 老大仔 文 章===================
謝謝 GrandRURU 大大提供的方式
我後來有試出來
錯誤原因是我在將Excel轉為圖片的這個動作時
應該要選用Bitmap而不是用Picture的方式
假如轉換出來是Picture的話好像就會有問題
但假如用Bitmap就不會有問題
然後接下來就是用TBitmap來接
再轉為JPEG就可以了~
系統時間:2017-12-16 20:48:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!