Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Глюки Pixels[x,y] в PBitMap.   Найти похожие ветки 

 
Clipper Chip   (2004-12-14 20:54) [0]

Привет, всем. Объясните пожайлуста, почему не правильно работает свойсвтво 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;


 
miek ©   (2004-12-14 21:05) [1]

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


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

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


 
Gandalf ©   (2004-12-14 22:04) [3]

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


 
miek ©   (2004-12-15 19:10) [4]

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


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

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


 
Gandalf ©   (2004-12-16 09:37) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.096 c
3-1118270900
Dron1173
2005-06-09 02:48
2005.07.18
Обработка ошибок при работе с базой данных.


14-1119434628
Ilya__
2005-06-22 14:03
2005.07.18
Какие системы поддерживают формат WMA.


14-1119507619
MacroDenS
2005-06-23 10:20
2005.07.18
Dura lex, sed lex - Закон суров, но закон!


14-1119421018
boalse
2005-06-22 10:16
2005.07.18
Подсчёт контрольной суммы.


1-1119795223
heady
2005-06-26 18:13
2005.07.18
окно поверх ВСЕХ остальных