- このトピックは空です。
-
投稿者投稿
-
2021年6月29日 11:44 AM #136
網中
ゲスト連続投稿で申し訳ありません。
TBitmapからWRObject.DIBDataにDIBをセットするテストを行っているのですがうまくいかずに困っています。
テストコード ——————————————
procedure TForm1.Button2Click(Sender: TObject);
var
rpt : WRReport;
preview : WRPreview;
bmp : TBitmap;
stream : TMemoryStream;
img : array of byte;
begin
// TBitmapからDIBイメージを取得
bmp := TBitmap.Create;
bmp.LoadFromFile(‘c:\temp\save.bmp’);
stream := TMemoryStream.Create;
bmp.SaveToStream(stream);
img := stream.Memory;// WingReportのイメージオブジェクトにDIBをセット
rpt := wrOCX.LoadReport(‘c:\temp\test.w30’);
rpt.Layer[1].WRObject(‘WrImage0’).DIBData := img;// プレビュー
preview := wrOCX.CreatePreview;
preview.OpenPreview(wrPREVIEWMODE_OVERLAP);
preview.ReportPrint(rpt);
end;
ここまで ———————————————-
(wrOCXはTWR3AXCL)
このテストコードを実行するとEAccessVioration例外になります。ファイル経由でやればうまく行くのですが、できれば一時ファイルを使いたくないと思い、試行錯誤しております。
何か良いお知恵がありましたら、ご教授ください。
よろしくお願いします。2021年6月29日 11:44 AM #137網中
ゲスト補足ですが、例外が発生するのはDIBDataにセットする行です。
rpt.Layer[1].WRObject(‘WrImage0’).DIBData := img;また、imgをファイルにダンプしたところ、Bitmapとして正常に表示できました。
2021年6月29日 11:45 AM #138伊藤@ソフトウィング
ゲストいつもお世話になっております。
以前掲示板にてご紹介させて頂きましたサンプル
が御座いますので、以下の方法で試して頂けます
でしょうか。サンプル開始
——————————–Var
Bitmap1: TBitmap;
Info, Image:array of byte;
bDibAll:array of byte;InfoSize,ImageSize: DWord;
vSetDib:variant;
beginBitmap1 := TBitmap.Create;
//サンプルとして、Imageコンポーネントの画像を使用します。
Bitmap1.Assign (Form1.Image1.Picture.Bitmap);//DIBサイズを取得する
GetDIBSizes(Bitmap1.Handle,InfoSize, ImageSize);SetLength(Info, InfoSize); //ビットマップインフォサイズ確保
SetLength(Image, ImageSize); //イメージサイズ確保//DIBデータを取得する
GetDIB(Bitmap1.Handle,Bitmap1.Palette,PBitmapInfo(Info)^, Pointer(Image)^);//DIBサイズをInfo+Bitsをふくめたサイズ確保
setlength(bDibAll, InfoSize + ImageSize);//DIBをまるごとコピーする
move(PBitmapInfo(Info)^, bDibAll[0],InfoSize);
move(Pointer(Image)^, bDibAll[InfoSize],ImageSize);//取得したDIBデータをVariant型にする
vSetDib := bDibAll;
//イメージデータをセットする
waxReport.Layer[2].WRObject(‘wriDenpyo’).dibdata :=vSetDib;——————————–
サンプルここまで以上、宜しくお願い致します。
2021年6月29日 11:45 AM #139網中
ゲストご回答ありがとうございました。
例示頂いたサンプルソースでうまくいきました。
bDibAllと私のテストコード中のimgを比較すると、bDbAllと同じデータがimgの15バイト目から始まっていました。
調べたところ、先頭14バイトはDIBのファイルヘッダ(C APIではBITMAPFILEHEADER構造体に対応する部分)です。これが不要でした。この部分(先頭14バイト)を除いたデータを取得すると、うまく行きました。
修正テストコード ————————————–
procedure TForm1.Button5Click(Sender: TObject);
const
OFFSET = 14;
var
rpt : WRReport;
preview : WRPreview;
bmp : TBitmap;
stream : TMemoryStream;
img : array of byte;
begin
// TBitmapからMemoryStream経由でDIBイメージを取得
bmp := TBitmap.Create;
bmp.LoadFromFile(‘c:\temp\save.bmp’);
stream := TMemoryStream.Create;
bmp.SaveToStream(stream);SetLength(img, stream.Size – OFFSET);
stream.Position := OFFSET;
stream.ReadBuffer(img[0], stream.Size – OFFSET);// WingReportのイメージオブジェクトにDIBをセット
rpt := wrOCX.LoadReport(‘c:\temp\test.w30’);
rpt.Layer[1].WRObject(‘WrImage0’).DIBData := img;// プレビュー
preview := wrOCX.CreatePreview;
preview.OpenPreview(wrPREVIEWMODE_OVERLAP);
preview.ReportPrint(rpt);FreeAndNil(stream);
FreeAndNil(bmp);
end;
ここまで ———————————————ご参考までに。
-
投稿者投稿
- フォーラム「旧サポート掲示板」には新規投稿および返信を追加できません。