Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Пример из Delphi не работает?!


Автор: Ofer 15.11.2008, 15:04
Открыл делфийскую справку по функции ScanLine. Скопировал пример и тут началось. Во-первых, с png работать не хочет - получаю ошибку Bit image is not valid. Во-вторых, когда заменил png на bmp, теряю 1/3 картинки. Почему так? Как быть?
Код

procedure TForm1.Button1Click(Sender: TObject);

// This example shows drawing directly to the BitMap
var
  x,y : Integer;
  BitMap : TBitMap;
  P : PByteArray;
begin
  BitMap := TBitMap.create;
  try
    // On Windows replace MyBitmap.png with a full pathname such as
    // C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp
    BitMap.LoadFromFile('MyBitmap.png');
    for y := 0 to BitMap.Height -1 do
    begin
      P := BitMap.ScanLine[y];

      for x := 0 to BitMap.Width -1 do
        P[x] := y;
    end;
    Canvas.Draw(0,0,BitMap);
  finally
    BitMap.Free;
  end;
end;



M
Alexeis
Модератор: Название темы должно отражать ее суть!

Автор: Данкинг 15.11.2008, 15:10
Цитата(Ofer @  15.11.2008,  15:04 Найти цитируемый пост)
Во-первых, с png работать не хочет - получаю ошибку Bit image is not valid.

А с чего вдруг вдруг TBitMap должен работать с PNG ?

Автор: Ofer 15.11.2008, 15:19
Данкинг, меня тоже это удивило, но поверил разработчикам Delphi на слово. Это ведь не мой код, а скопированный из справки.

Автор: ivan219 15.11.2008, 19:51
Код

var
  p: PByteArray;
.
.
.
.
.
   for x := 0 to BitMap.Width -1 do
    for y := 0 to BitMap.Height -1 do
     begin
      P := BitMap.ScanLine[y];
      P[x * 3] := 255; // цвет синий
      P[x * 3 + 1] := 255;// цвет зелёный
      P[x * 3 + 2] := 255;// цвет красный
     end;

Автор: AntonN 15.11.2008, 21:55
ivan219,
пробег по высоте делается первым, потому как операция получения строки пикселов весьма ресурсоемкая задача.
причем пример зависит от дитности битмапа, работать будет только с pf24bit
Код

for y := 0 to BitMap.Height -1 do begin
     P := BitMap.ScanLine[y];
    for x := 0 to BitMap.Width -1 do   begin
      P[x * 3] := 255; // цвет синий
      P[x * 3 + 1] := 255;// цвет зелёный
      P[x * 3 + 2] := 255;// цвет красный
     end;
end;


тот же пример, но наверное удобнее smile

Код

const
  MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
  PRGBAArray = ^TRGBAArray;
  TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;

var bt:tbitmap;  x,y:Integer; RowOut:PRGBAArray;
begin
 for y:=0 to bt.Height-1 do begin
     RowOut:= bt.ScanLine[y];
    for x:=0 to bt.Width-1 do begin
       RowOut[x].rgbRed:=(255-RowOut[x].rgbRed);
       RowOut[x].rgbGreen:=255-RowOut[x].rgbGreen;
       RowOut[x].rgbBlue:=(255-RowOut[x].rgbBlue);
    end;
  end;
end;



PS. а png они разные бывают...

Автор: Ofer 15.11.2008, 22:10
ivan219, не пойму к чему это smile

AntonN, что-то с вашим кодом веселенькое изображение получаетсья ;)

Цитата(AntonN @  15.11.2008,  21:55 Найти цитируемый пост)
PS. а png они разные бывают...

Например?

Автор: AntonN 15.11.2008, 22:15
Ofer, какая версия Дельфи? возможно в последних релизах и сделали поддержку png, мало ли...

Автор: Ofer 15.11.2008, 22:20
Delphi 7

Автор: AntonN 15.11.2008, 22:38
да вообще там в комментарии не написано заменить путь на виндовс? smile

Автор: Ofer 15.11.2008, 22:42
Ну, там написано, чтоб заменить путь на существующий файл. Как я и поступил. Но с BMP все равно работет фигово :(

Автор: ivan219 16.11.2008, 13:07
Цитата(Ofer @  15.11.2008,  22:10 Найти цитируемый пост)
не пойму к чему это 

К вот этому:
Код

procedure TForm1.Button1Click(Sender: TObject);

// This example shows drawing directly to the BitMap
var
  x,y : Integer;
  BitMap : TBitMap;
  P : PByteArray;
begin
  BitMap := TBitMap.create;
  try
    // On Windows replace MyBitmap.png with a full pathname such as
    // C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp
    BitMap.LoadFromFile('MyBitmap.png');
    for y := 0 to BitMap.Height -1 do
    begin
      P := BitMap.ScanLine[y];

      for x := 0 to BitMap.Width -1 do
        P[x] := y;
    end;
    Canvas.Draw(0,0,BitMap);
  finally
    BitMap.Free;
  end;
end;

AntonN, да немного ошибся.
Ofer, попробуй этот код:
Код

procedure TForm1.Button1Click(Sender: TObject);

// This example shows drawing directly to the BitMap
var
  x,y : Integer;
  BitMap : TBitMap;
  P : PByteArray;
begin
  BitMap := TBitMap.create;
  try
    // On Windows replace MyBitmap.png with a full pathname such as
    // C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp
    BitMap.LoadFromFile('MyBitmap.png');
    for y := 0 to BitMap.Height -1 do begin
     P := BitMap.ScanLine[y];
    for x := 0 to BitMap.Width -1 do   begin
      P[x * 3] := 255; // цвет синий
      P[x * 3 + 1] := 255;// цвет зелёный
      P[x * 3 + 2] := 255;// цвет красный
     end;
end;
    Canvas.Draw(0,0,BitMap);
  finally
    BitMap.Free;
  end;
end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)