Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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х больше кнопок :)) и есть новые фильтры.



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

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

Наверх









Память: 0.85 MB
Время: 0.031 c
1-42455
Electric
2001-12-24 05:28
2002.01.14
Как нажатием кнопки на своей форме прервать цикл


3-42356
bk
2001-12-09 16:30
2002.01.14
Probeli V ADO


6-42521
Zork
2001-10-17 13:33
2002.01.14
ClientSocket and ServerSocket


4-42620
Севостьянов Игорь
2001-11-14 11:58
2002.01.14
Кто-нибудь работал с ReadEventLog ?


14-42545
Dush
2001-11-13 16:20
2002.01.14
Проблема с винтом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский