現在、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;
お手数ですが、お願いいたします。
これで内容をコピーできましたよ。
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;
> for x := 0 to w do begin
w-1では?
>> for x := 0 to w do begin
>w-1では?
おお、そうですね。
上のわたしのコードのうち、ここさんの指摘のように w のところは w-1 です。
これでうまくいくのは、行ごとにポインタをScaline[]で設定し、バッファの配列
には buff[x + y*w] でアクセスしているので、行ごとのオーバーランは修正
されるからです。最後の行が1バイトオーバーランすることを除けば、画像データ
そのものは、バッファに正しく書き込まれます。つまり、 w のところは w-1 に
するべきです。それで最後の1バイトオーバーランもなくなります。
ここ 様 junki 様 ありがとうございました。
やはり、単純なミスでした。 お礼が遅れて申し訳ございません。
ツイート | ![]() |