![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать 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;
и вперёд ...