【WR3.1】DelphiでDIBDataにTBitmap内のDIBをセットする方法

HOME › フォーラム › 旧サポート掲示板 › 【WR3.1】DelphiでDIBDataにTBitmap内のDIBをセットする方法

  • このトピックは空です。
4件の投稿を表示中 - 1 - 4件目 (全4件中)
  • 投稿者
    投稿
  • #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例外になります。

    ファイル経由でやればうまく行くのですが、できれば一時ファイルを使いたくないと思い、試行錯誤しております。

    何か良いお知恵がありましたら、ご教授ください。
    よろしくお願いします。

    #137
    網中
    ゲスト

    補足ですが、例外が発生するのはDIBDataにセットする行です。
    rpt.Layer[1].WRObject(‘WrImage0’).DIBData := img;

    また、imgをファイルにダンプしたところ、Bitmapとして正常に表示できました。

    #138
    伊藤@ソフトウィング
    ゲスト

    いつもお世話になっております。

    以前掲示板にてご紹介させて頂きましたサンプル
    が御座いますので、以下の方法で試して頂けます
    でしょうか。

    サンプル開始
    ——————————–

    Var

     Bitmap1: TBitmap;
     Info, Image:array of byte;
     bDibAll:array of byte;

     InfoSize,ImageSize: DWord;

     vSetDib:variant;
     
    begin

    Bitmap1 := 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;

    ——————————–
    サンプルここまで

    以上、宜しくお願い致します。

    #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;
    ここまで ———————————————

    ご参考までに。

4件の投稿を表示中 - 1 - 4件目 (全4件中)
  • フォーラム「旧サポート掲示板」には新規投稿および返信を追加できません。