Форум: "KOL";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизГлюки 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 вся ветка
Форум: "KOL";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c