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

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

Как сделать flip для Tbitmap


Oxy ©   (2003-06-20 13:14:00) 

Такая трабла. Есть TBitmap и мне надо сделать вертикальный или горизонтальный флип. Когда точно известно PixelFormat (например PixelFormat=pf24bit), то все без проблем. Я делаю прямой доступ к данным битмапы через scanline и копирую куда мне надо. Но я не знаю как быть когда PixelFormat=pfDevice. Тогда мне не известен размер элемента изображения (pixel) в байтах и не могу копировать.
Можно конечно через TBitmap.Canvas.Pixels, но там скорость вообще никакая. Но как то же эта ф-ция Pixels определяет откуда брать данные. Может есть какой то более быстрый способ доступа к битмапе или какой то способ определения формата пикселя?


Oxy   (2003-06-20 16:33:00) [1]

Ок, я уже тоже сделал. Но все равно спасибо.


MBo   (2003-06-20 15:56:00) [2]

StretchBlt(bmp2.Canvas.handle,
bmp2.width-1, bmp2.height-1,
-bmp2.width, -bmp2.height,
bmp1.Canvas.Handle,
0,0,
bmp1.width, bmp1.height,
SRCCOPY);


Oxy   (2003-06-20 15:25:00) [3]

2 icWasya ©
Не работает оно и так. :-(

2 MBo ©
Дык как сместить?
Ну на моем примере можешь показать?


MBo   (2003-06-20 15:19:00) [4]

оно работает, только в невидимую область выводит ;))
смести нач. точку


icWasya   (2003-06-20 15:19:00) [5]

не так

StretchBlt(bmp2.Canvas.handle,
0,0,
bmp2.width, bmp2.height,
bmp1.Canvas.Handle,
0,0,
-bmp1.width, -bmp1.height,
( bmp2.Canvas.handle,
0,0,
bmp2.width, bmp2.height,
bmp1.Canvas.Handle,
bmp1.width, bmp1.height,
0,0,
SRCCOPY
)

не так

StretchBlt(bmp2.Canvas.handle,
0,0,
bmp2.width, bmp2.height,
bmp1.Canvas.Handle,
0,0,
-bmp1.width, -bmp1.height,
SRCCOPY);


а так

StretchBlt(bmp2.Canvas.handle,
0,0,
bmp2.width, bmp2.height,
bmp1.Canvas.Handle,
bmp1.width, bmp1.height,
0,0,
SRCCOPY);




Oxy   (2003-06-20 15:10:00) [6]

Ладно, попробовал я так.

StretchBlt(bmp2.Canvas.handle,
0,0,
bmp2.width, bmp2.height,
bmp1.Canvas.Handle,
0,0,
-bmp1.width, -bmp1.height,
SRCCOPY);


А в хелпе написано

StretchBlt creates a mirror image of a bitmap if the signs of the nWidthSrc and nWidthDest parameters or of the nHeightSrc and nHeightDest parameters differ. If nWidthSrc and nWidthDest have different signs, the function creates a mirror image of the bitmap along the x-axis. If nHeightSrc and nHeightDest have different signs, the function creates a mirror image of the bitmap along the y-axis.

И... ничего не работает. Может кинешь примерчик 100% рабочего кода?


MBo   (2003-06-20 14:43:00) [7]

>А сделать flip справа на лево так можна?
ты внимательно прочитал ответ и хелп?

>именно с pfDevice
Get/SetBitmapBits


cult   (2003-06-20 14:32:00) [8]

Если Win98 не принципиально - то можно пользоваться SetWorldTransform


Oxy   (2003-06-20 14:28:00) [9]

перевернуть картинку - StretchBlt с отрицательной высотой или шириной приемника (или TCanvas.StretchDraw)

А сделать flip справа на лево так можна?

А про шустрый доступ (но не c pfDevice) - в Статьи загляни

Это я и сам знаю. Мне бы именно с pfDevice


MBo   (2003-06-20 14:11:00) [10]

перевернуть картинку - StretchBlt с отрицательной высотой или шириной приемника (или TCanvas.StretchDraw)

А про шустрый доступ (но не c pfDevice) - в Статьи загляни


Oxy   (2003-06-20 14:04:00) [11]

Ты не понимаешь. Я использую TBitmap в компоненте. Я рисую на него, а потом копирую на канву компонента. Так же мне нужен flip этой битмапы в другом TBitmap и его я тоже копирую на канву компонента. И если я явно задам pf24bit, то в системе с 256 цветами получится что то ужасно уродливое.


icWasya   (2003-06-20 13:57:00) [12]

ну дык явно установи, например

Image1.Picture.Bitmap.PixelFormat:=pf32bit;

и вперёд ...


Наверх

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