Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.14;
Скачать: CL | DM;

Вниз

Поворачивание Tbitmap - как?   Найти похожие ветки 

 
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. А что творишь то , собрат по интересу?




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

Текущий архив: 2002.01.14;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.01 c
4-42595
Pat
2001-11-11 00:57
2002.01.14
Не убей!!!


6-42524
Victoz
2001-10-19 11:05
2002.01.14
Опять про WinPopup и Mailslot и немного про кодировки


4-42612
sandman
2001-11-10 20:34
2002.01.14
Отсылка сообщения через OLE


1-42504
Don
2001-12-25 17:14
2002.01.14
Ширина ScrollBar-а


1-42492
DJ X
2001-12-25 18:24
2002.01.14
Текст в Label е