Форум: "Media";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизНенормальный 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 вся ветка
Форум: "Media";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c