Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
ВнизПоворачивание 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c