Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Вниз

Поворачивание Tbitmap - как? 


.: Joiro :.   (2001-12-24 00:25) [0]

Итак опять появилась нужда в помощи знатоков. Знаю, что вопрос возможно глупый и часто задаваемый, но в FAQ"е ответа найти не удалось и Help тоже не помог.

Надо просто повернуть Tbitmap (это важно) на 90 градусов в одну или другую сторону. Сначала я подумал о считывании всех пикселов и переписывании их обратно уже повернутыми. Но это казалось слишком как-то неправильным - должны же существовать готовые функции. Посмотрел Help у Delphi и там по поводу вращения нашлось только это:

TBitmap is an encapsulation of a Windows bitmap (HBITMAP), including its palette (HPALETTE).
A bitmap is a powerful graphics object used to create, manipulate (scale, scroll, rotate, and paint), and store images in memory and as files on a disk.

Тут ясно сказано что манипуляции включают ротацию, но нет абсолютно никакой информации об этом. Буду благодарен за совет, как это сделать (только не с помощью компонентов или ещё чего-то такого - повороты на 90 градусов и это не для анимации, так что просто Delphi должно хватить).

Спасибо.



MBo   (2001-12-24 08:15) [1]

http://www.lmc-mediaagentur.de/dpool/tips01/0095.htm



vbazik   (2001-12-24 15:14) [2]

Вопрос вовсе и не глупый. К сожалению на форуме вопросы графики обсуждаются почему то не так часто как хотелось бы (на мой субъективный взгляд). Может меньше народа интересует.
> MBo
Предложенный пример работать не захотел :( из-за отсутствия описания ТHelpRGB. Еще раз благодарен за помощь с TPoligon :)

> Jorio Раньше писал такую прогу. Поищу в загашнике - кину. А пока посмотри на данном форуме, а именно:

Тут еще такой вопросец возник трансформирование Bitmap"ov
(Kost 23.12.01 16:29)
[D6, Win2k] » Как повернуть Bitmap на заданный угол?
Ответов: 2 vbazik, vbazik
Здесь решение для произвольного угла, поэтому работает дольше.
Для 90 х n градусов писал отдельно, работает шустрее. Найду - скину.



vbazik   (2001-12-24 15:14) [3]

Вопрос вовсе и не глупый. К сожалению на форуме вопросы графики обсуждаются почему то не так часто как хотелось бы (на мой субъективный взгляд). Может меньше народа интересует.
> MBo
Предложенный пример работать не захотел :( из-за отсутствия описания ТHelpRGB. Еще раз благодарен за помощь с TPoligon :)

> Jorio Раньше писал такую прогу. Поищу в загашнике - кину. А пока посмотри на данном форуме, а именно:

Тут еще такой вопросец возник трансформирование Bitmap"ov
(Kost 23.12.01 16:29)
[D6, Win2k] » Как повернуть Bitmap на заданный угол?
Ответов: 2 vbazik, vbazik
Здесь решение для произвольного угла, поэтому работает дольше.
Для 90 х n градусов писал отдельно, работает шустрее. Найду - скину.



vbazik   (2001-12-24 15:15) [4]

Вопрос вовсе и не глупый. К сожалению на форуме вопросы графики обсуждаются почему то не так часто как хотелось бы (на мой субъективный взгляд). Может меньше народа интересует.
> MBo
Предложенный пример работать не захотел :( из-за отсутствия описания ТHelpRGB. Еще раз благодарен за помощь с TPoligon :)

> Jorio Раньше писал такую прогу. Поищу в загашнике - кину. А пока посмотри на данном форуме, а именно:

Тут еще такой вопросец возник трансформирование Bitmap"ov
(Kost 23.12.01 16:29)



vbazik   (2001-12-24 15:20) [5]

Sorry за дубль - какой то глюк



.: Joiro :.   (2001-12-25 12:34) [6]

vbazik - спасибо. Да, о графике тут немного говорят. Ну, самому искать ответы тоже неплохо, только вот такие тупики бесят. :)

Посмотрел пример. Только количество строчек там пугает. В моей программке всё остальное удалось более-менее оптимально сделать, а поворачивание получается как-то страшно громоздко. Тем более что нужны только повороты на 90-то градусов. Наверное надо и будет использовать тот самый приём с массивом точек и Scanline...



vbazik   (2001-12-25 13:24) [7]

Не мучайся, (хоть это иной раз и полезно ;) )
Это то что обещал найти. Компактнее и существенно быстрее работает.
В отличии от других встреченных мною примеров этого геморроя
работает с gray-8bit, color-8bit,24bit :))
-------------------
procedure povorot90(Im1:TBitmap;var Im2:TBitmap);
function Pixel_Size(Im : TBitmap ): byte ;// Возвращает размер пиксела
//картинки в байтах
var
pix_size : byte ;
begin
case Im.PixelFormat of
pf24bit: pix_size := 3 ;
pf8bit : pix_size := 1 ;
pf16bit : pix_size := 2 ;
pf32bit : pix_size := 4 ;
else pix_size:= 0 ;
end;
Pixel_Size := pix_size ;
end;

var // povorot90
x,y,h,w,tmp,i,i3:integer;
R,G,B,Intens,size_ : byte ;// size_ - размер пиксела в байтах
pntr : PBytearray ; // указатель на адреса памяти в кот. находится Im1
pntr2: PBytearray ; // указатель на адреса памяти в кот. Im2
line_size : integer ;// длина строки изображения в байтах
index :integer ;// определяет смещение от начала строкии в байтах
bmp1 , bmp2 : ^TBitmap ;
begin
h := Im1.Height-1 ;
w := Im1.Width-1 ;
Im2.Height := w + 1 ;
Im2.Width := h + 1;
size_ := Pixel_Size( Im1 ) ;
if not(size_ in [1..4])then
begin MessageBox(0,"Im1:Unsupported type of bitmap","Error",0);exit; end;

Im2.PixelFormat := Im1.PixelFormat ;
Im2.Palette := Im1.Palette ;

i3 := 0 ;
line_size := (h+1) * size_ ;
if (line_size mod 4 <> 0)
then line_size := line_size + 4 - line_size mod 4 ;
for y := 0 to h do
begin
pntr := Im1.ScanLine[y];// получение указателя на начало Y строки
pntr2:= Im2.ScanLine[0];// получение указателя на начало 0 строки
i:= 0 ;
for x:= 0 to w do
begin
tmp := w-x ;
R := pntr[i] ;G := 0 ; B := 0 ; Intens := 0 ;
if size_ > 1 then G := pntr[i + 1] ;
if size_ > 2 then B := pntr[i + 2] ;
if size_ > 3 then Intens := pntr[i + 3] ;
index := -line_size * tmp ;
try
pntr2 [i3 + index ] := R ;
if size_ > 1 then pntr2 [i3 + index + 1] := G ;
if size_ > 2 then pntr2 [i3 + index + 2] := B ;
if size_ > 3 then pntr2 [i3 + index + 3] := Intens ;
except
end;
i := i + size_ ;
end;
i3 := i3 + size_ ;
end;
Im2.ReleasePalette ;
end;

-------------------------------------
p.s. А что творишь то , собрат по интересу?



.: Joiro :.   (2001-12-25 15:04) [8]

Так, сейчас попробую этот вариант. А творю я такое чудо техники как едитор тайлов (от Tiles - елементы графики для игр). У этого едитора такой интерфейсс что почти никто кроме меня с ним не способен работать (хехе), но на данный момент только сам с ним и работаю а пожже будет хелп.

Особенность у него такая что он работает с заготовками и при помощи разных фильтров делает всякие интересные вещи с тайлами.

Тут: http://www.ltn.lv/~joiro/ весьма старая версия и скриншот. Сейчас уже намного дальше (2х больше кнопок :)) и есть новые фильтры.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.039 c
14-42543          skiph                 2001-11-12 08:31  2002.01.14  
HTML help


4-42616           Kyd                   2001-11-13 11:18  2002.01.14  
SendMessage(MyHandle, WM_SetText, 0, Integer(TextToSet));


7-42582           Maestro               2001-09-23 13:14  2002.01.14  
Как сделать форму прозрачной


6-42531           RealMan               2001-10-19 17:06  2002.01.14  
Удалённый запуск программы


1-42413           Andrey196             2001-12-26 21:38  2002.01.14  
Как фон Labela сделать прозрачным?