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

Вниз

Ненормальный TCanvas   Найти похожие ветки 

 
debuger ©   (2004-09-22 21:33) [0]

Впервые встретил такое, что TCanvas.Pixels[ i, j ] возвращает -1. В хэлпе вычитал, что это в том случаэ когда DC, не поддержывает данную фичу, дословно - ему на нее просто...(все поняли).
Каким тогда образом мне пикселы с канваса вычитать.

И еще один глюк:
Есть TImage, я на евго канвасе чего-то рисую, конечно же не забываю TImage.Repaint. И все хорошо, до того момента пока не потягаю форму по экрану, после этого имага залипает и не обновляется. Что это?


 
Рыба ©   (2004-09-22 21:48) [1]

У тебя ошибка в программе.


 
Mihey_temporary ©   (2004-09-22 22:37) [2]

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


 
MBo ©   (2004-09-23 07:49) [3]

If the position is outside the clipping rectangle, reading the value of Pixels returns -1.


 
debuger ©   (2004-09-23 14:20) [4]

2 MBo >> Not every device context supports the Pixels property. Reading the Pixels property for such a device context will return a value of -1. Setting the Pixels property for such a device context does nothing.

Теперь код:
procedure Work;
begin
 repeat
   framesPerSecond := GetTickCount;

   Processing( FMain.PVideoView.Handle );

   framesPerSecond := GetTickCount - framesPerSecond;
   fmain.lbl1.caption := "fps: " + inttostr( framesPerSecond );

   FMain.PVideoView.Repaint;
   FMain.IVideoView.Repaint;
   FMain.IDebugView1.Repaint;
   FMain.IDebugView2.Repaint;

   Application.ProcessMessages;

   FMain.SITakeSnapShotClick( FMain );
 until false;
end;

Раниться эта процедурка так:
 BeginThread( nil, 0, @Work, nil, 0, threadID );

procedure Processing( handle: HWND );
begin
 // подготовка и передача кадра
 PrepareWorkCanvas( handle );

 // передача управления
 ImageProcessing;
end;

procedure PrepareWorkCanvas( handle: HWND );
begin
 workDC := GetDC( handle );
 currentFrame.Handle := workDC;

 BitBlt ( currentFrame.Handle, 0, 0, mapSize.width, mapSize.height, workDC, 0, 0, SRCCOPY );
 
 FMain.IVideoView.Canvas.CopyRect( videoRect, currentFrame, videoRect );
 GetImage( SI_CURRENTSHOT, FMain.IVideoView.Canvas );

 ReleaseDC( handle, workDC );
end;

procedure GetImage( mapID: byte; canvas: TCanvas );
var
 i, j: byte;
begin
 // локаем канвас, чтобы никакая падла туда не писала
 //FMain.IDebugView2.canvas.TryLock;

 // попиксельно получаем карту

 // уменьшение центральный выбор
 for i := 0 to mapSize.width do
   for j := 0 to mapSize.height do
     begin
       map[ mapID ][ i, j ] := ColorGScale( canvas.Pixels[ i * reductionRate, j * reductionRate ] );
     end;
end;


 
programania ©   (2004-09-23 20:25) [5]

>debuger
Насчет pixel=-1
Это когда старший бит=1 или 4-ый байт цвета<>0
возможно тот кто записал этот цвет использовал его как alpha канал, попробуй его просто обнулить: pixels[i,j] and $FFFFFF;


 
debuger ©   (2004-09-23 20:38) [6]

У-у-у. Вы о чем? Для кого я вырезку их хэлпа постил в самом начале предидущей мессаги?

я спрашиваю почему осыпаеться мой канвас? тот что FMain.IVideoView.Canvas
FMain - TForm
IVideoView - TImage

function ColorG3Scale( col: tclolor): byte;
begin
 result := col and $FF;
end;



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

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

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1102308959
Frozzen
2004-12-06 07:55
2004.12.19
Нестандартная работа с dll


3-1100614292
CHTR
2004-11-16 17:11
2004.12.19
Не могу вытащить картинку из BLOB поля


1-1102270323
fuzzu
2004-12-05 21:12
2004.12.19
Как автоматически создать N количество CheckBox ов?


1-1102075083
kaktus
2004-12-03 14:58
2004.12.19
Как убить приожение?


1-1101916379
HydraMarat
2004-12-01 18:52
2004.12.19
Каждая процедурка для каждого типа или "монстр" для всех?