Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюки Pixels[x,y] в PBitMap. [Delphi, Windows]


Clipper Chip ©   (2004-12-14 20:54:00) 

Привет, всем. Объясните пожайлуста, почему не правильно работает свойсвтво Pixels у объекта PBitMap.
Изображение создано в photoshop 6 и сохранено в bmp, как 8 bit.
После преобразований над x,y(здесь они опущены, т.к. не имеют никакого отношения к данной проблеме)

делаю newcolor := Background.Pixels[x,y] чтобы получить цвет заданного пиксела, по идее это должно быть
8-ми битное число от 0 до 255, а получаются числа в пределах от "-" до "+" 32 тыс. что за ерунда???
картинка после этого становится практически черной(с DIBBitmap полностью черная).
Пробовал использовать и NewBitmap и NewDIBBitmap, ничего.
Смотрел этот код с использованием DXDIB(из DelphiX) вместо PBitMap, там возвращаются нормальные значения 0..255.
DXDIB просто вставить не получилось, он преимущественно на VCL.

Вот этот код:
const
 MAXX = 320;
 MAXY = 120;

var
 BMP1: PBitMap;
 Background: PBitMap;
 PB:pControl;

procedure DrawPaint( Dummy: Pointer; Sender: PControl; DC: HDC );
var
 x,y,newcolor: Smallint;
begin
 for y:=0 to MAXY do begin
   for x:=0 to MAXX do begin
     //здесь шли преобразования x,y,
     //потом идет смена цвета:
     newcolor := Background.Pixels[x,y];//(<-ERR!!!)если dib ставлю DIBPixels
     BMP1.Pixels[x,y] := newcolor; // newcolor - неправильный, всегда
                                   // идут значения примерно от "-" до "+" 32 тыс.
                                   // подозрение что bmp всегда определяется как 16 битное.
   end;
 end;

 BMP1.Draw(PB.Canvas.Handle,0,0);
end;

procedure TForm1.Button1Click(Sender: PObj);
begin
 if PB = nil then
 begin
  PB := NewPaintBox(Form);
  PB.OnPaint := TOnPaint(MakeMethod( nil, @DrawPaint ));
 end;

 if BMP1 = nil then
  Bmp1 := NewBitmap(MAXX, MAXY);//NewDIBBitmap(MAXX, MAXY, pf8bit) если DIB
 if Background = nil then
  Background := NewBitmap(MAXX, MAXY); //NewDIBBitmap(MAXX, MAXY, pf8bit) если DIB
 Background.LoadFromFile('hello.bmp');

 PB.Width := Background.Width;
 PB.Height:= Background.Height;

//  BMP1.Assign(Background);
end;


Gandalf   (2004-12-16 09:37:00) [1]

Может и должен - но Scan всегда помогает - да и недленный этот pixels...


Clipper Chip   (2004-12-15 21:30:00) [2]

Все получилось, сделал так:
RowBmp := BMP1.Scanline[y];
RowBmp[x] := pByteArray(Background.Scanline[y])^[x];
(где RowBmp: PByteArray;)
Но, по-моему, все-таки Pixels должен возвращать реальный цвет пикселя соответствующий битовой маске.


miek   (2004-12-15 19:10:00) [3]

Такое бывает, когда по какой-то причине слетает формат спрайта в pfCustom.


Gandalf   (2004-12-14 22:04:00) [4]

Насколько я понимаю GetPixel работает как должно - выдает RGB. Тебе нужно ScanLine - оно гамма зависимое.


Clipper Chip   (2004-12-14 21:27:00) [5]

использовал - ничего, все также.
я даже в комментарие написал: // если dib ставлю DIBPixels


miek   (2004-12-14 21:05:00) [6]

Используй свойство DIBPixels.


Наверх

Титульная страница Поиск, карта сайта Написать письмо