1bitBmp->Buffer取り込み方法

解決


Paper  2006-09-26 06:57:10  No: 23364

現在、1bitBmpを読み込みデータ部分をバッファに書き込みたいのですがどうしても、うまくいきません。  ものすごく致命的な間違いをしているのだと思いますが  恥ずかしながら現状分かりません。  どなかたお教え願えないでしょうか?  下が、現在書き込んだソースです。
var
  Bm : TBitmap;
  BmBuff : Array of Byte;
  PLine : PByteArray;
  y, x : Integer;
  w, h : Integer;
begin
  Bm := TBitmap.Create;
  Bm.LoadFromFile('C:\test.bmp');
  w := (Bm.Width + 7) div 8;
  h := Bm.Height;
  SetLength(BmBuff, w * h);
  for y := 0 to h - 1 do begin
    PLine := Bm.ScanLine[y];
    for x := 0 to w do begin
      BmBuff[x + y*w] := PLine[x];
    end;
  end;
end;
お手数ですが、お願いいたします。


junki  URL  2006-09-26 19:36:21  No: 23365

これで内容をコピーできましたよ。

procedure TForm1.Button1Click(Sender: TObject);
var
  bmp1, bmp2: TBitmap;
  buff: array of byte;
  pLine: PByte;
  x, y, w, h: integer;
begin
  bmp1 := TBitmap.Create;
  bmp1.LoadFromFile('c:\test.bmp');
  Canvas.Draw(5, 5, bmp1);

  w := (bmp1.Width + 7) div 8;
  h := bmp1.Height;
  SetLength(buff, w * h);
  for y := 0 to h - 1 do begin
    pLine := bmp1.ScanLine[y];
    for x := 0 to w do begin
      buff[x + y*w] := pLine^;
      inc(pLine);
    end;
  end;

  bmp2 := TBitmap.Create;
  bmp2.PixelFormat := pf1bit;
  bmp2.Width := bmp1.Width;
  bmp2.Height := bmp1.Height;
  for y := 0 to h - 1 do begin
    pLine := bmp2.ScanLine[y];
    for x := 0 to w do begin
      pLine^ := buff[x + y*w];
      inc(pLine);
    end;
  end;

  Canvas.Draw(5, h+10, bmp2);

  bmp1.Free;
  bmp2.Free;
end;


ここ  2006-09-26 20:10:11  No: 23366

> for x := 0 to w do begin
w-1では?


junki  2006-09-26 20:16:17  No: 23367

>> for x := 0 to w do begin
>w-1では?

おお、そうですね。


junki  2006-09-26 20:34:21  No: 23368

上のわたしのコードのうち、ここさんの指摘のように w のところは w-1 です。

これでうまくいくのは、行ごとにポインタをScaline[]で設定し、バッファの配列
には buff[x + y*w] でアクセスしているので、行ごとのオーバーランは修正
されるからです。最後の行が1バイトオーバーランすることを除けば、画像データ
そのものは、バッファに正しく書き込まれます。つまり、 w のところは w-1 に
するべきです。それで最後の1バイトオーバーランもなくなります。


Paper  2006-09-26 22:47:34  No: 23369

ここ  様  junki 様  ありがとうございました。
やはり、単純なミスでした。  お礼が遅れて申し訳ございません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加