Girar em tantos graus?
Olá
Alguem tem alguma funcao que gira um Canvas ou um TImage ou qualquer coisa do tipo em Tantos graus iguao ao q o Paint faz?
Obrigado!
Alguem tem alguma funcao que gira um Canvas ou um TImage ou qualquer coisa do tipo em Tantos graus iguao ao q o Paint faz?
Obrigado!
Nildo
Curtidas 0
Respostas
Cebikyn
08/08/2003
Tem essa aí, não sei se funciona... se der erro, avisa...
ela não trabalha exatamente com o canvas, mas sim com o [b:8020d5fba5]TBitmap[/b:8020d5fba5].
[b:8020d5fba5]BitmapOriginal[/b:8020d5fba5]: TBitmap que será rotacionado
[b:8020d5fba5]iRotationAxis[/b:8020d5fba5], [b:8020d5fba5]jRotationAxis[/b:8020d5fba5]: Coordenadas do centro de rotação
[b:8020d5fba5]AngleOfRotation[/b:8020d5fba5]: Ângulo para rotacionar a figura. O ângulo deve ser em radianos, para converter graus para radianos use a função DegToRad.
[b:8020d5fba5]RotateMilliseconds[/b:8020d5fba5]: Variável do tipo [i:8020d5fba5]DWORD[/i:8020d5fba5] que armasenará quanto tempo foi necessário para realizar o procedimento (em milisegundos).
É necessário incluir [b:8020d5fba5]Math[/b:8020d5fba5] na seção [i:8020d5fba5]uses[/i:8020d5fba5] de sua [i:8020d5fba5]unit[/i:8020d5fba5]
ela não trabalha exatamente com o canvas, mas sim com o [b:8020d5fba5]TBitmap[/b:8020d5fba5].
FUNCTION RotateBitmapMethod1(CONST BitmapOriginal: TBitmap; CONST iRotationAxis, jRotationAxis: INTEGER; CONST AngleOfRotation: DOUBLE; // em radianos VAR RotateMilliseconds: DWORD): TBitmap; VAR cosTheta : EXTENDED; i : INTEGER; iOriginal : INTEGER; iPrime : INTEGER; j : INTEGER; jOriginal : INTEGER; jPrime : INTEGER; RowOriginal : pRGBTripleArray; RowRotated : pRGBTRipleArray; sinTheta : EXTENDED; StartTime : DWORD; begin RESULT := TBitmap.Create; RESULT.Width := BitmapOriginal.Width; RESULT.Height := BitmapOriginal.Height; RESULT.PixelFormat := pf24bit; StartTime := GetTickCount; sincos(AngleOfRotation, sinTheta, cosTheta); FOR j := RESULT.Height-1 DOWNTO 0 DO BEGIN RowRotated := RESULT.Scanline[j]; jPrime := j - jRotationAxis; FOR i := RESULT.Width-1 DOWNTO 0 DO BEGIN iPrime := i - iRotationAxis; iOriginal := iRotationAxis + ROUND(iPrime * CosTheta - jPrime * sinTheta); jOriginal := jRotationAxis + ROUND(iPrime * sinTheta + jPrime * cosTheta); IF (iOriginal >= 0) AND (iOriginal <= BitmapOriginal.Width-1) AND (jOriginal >= 0) AND (jOriginal <= BitmapOriginal.Height-1) THEN BEGIN RowOriginal := BitmapOriginal.Scanline[jOriginal]; RowRotated[i] := RowOriginal[iOriginal] END ELSE BEGIN RowRotated[i].rgbtBlue := 255; // Nessas três linhas RowRotated[i].rgbtGreen := 0; // de código você altera RowRotated[i].rgbtRed := 0; // a cor de fundo da figura final END END END; RotateMilliseconds := GetTickCount - StartTime; END;
[b:8020d5fba5]BitmapOriginal[/b:8020d5fba5]: TBitmap que será rotacionado
[b:8020d5fba5]iRotationAxis[/b:8020d5fba5], [b:8020d5fba5]jRotationAxis[/b:8020d5fba5]: Coordenadas do centro de rotação
[b:8020d5fba5]AngleOfRotation[/b:8020d5fba5]: Ângulo para rotacionar a figura. O ângulo deve ser em radianos, para converter graus para radianos use a função DegToRad.
[b:8020d5fba5]RotateMilliseconds[/b:8020d5fba5]: Variável do tipo [i:8020d5fba5]DWORD[/i:8020d5fba5] que armasenará quanto tempo foi necessário para realizar o procedimento (em milisegundos).
É necessário incluir [b:8020d5fba5]Math[/b:8020d5fba5] na seção [i:8020d5fba5]uses[/i:8020d5fba5] de sua [i:8020d5fba5]unit[/i:8020d5fba5]
GOSTEI 0
Marcelo Saviski
08/08/2003
O que é esse [color=red:75e4372f62]pRGBTripleArray [/color:75e4372f62]?
GOSTEI 0
Cebikyn
08/08/2003
É um tipo de variável. Eis o trecho de código que estava faltando:
const MaxPixelCount = 32768; type TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple; pRGBTripleArray = ^TRGBTripleArray;
GOSTEI 0
Nildo
08/08/2003
Valew!
Funciono!
Funciono!
GOSTEI 0
Robotizar
08/08/2003
É um tipo de variável. Eis o trecho de código que estava faltando:
const MaxPixelCount = 32768; type TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple; pRGBTripleArray = ^TRGBTripleArray;
eu num entendo de ponteiros não mais pq vc usou como ponteiro? pq num usou TRGBTripleArray de uma vez? o q ganha com isso?
se alguém poder me responder ficarei agradecido
GOSTEI 0
Marcelo Saviski
08/08/2003
[quote:3ee9873809=´cebikyn´]É um tipo de variável. Eis o trecho de código que estava faltando:
const MaxPixelCount = 32768; type TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple; pRGBTripleArray = ^TRGBTripleArray;
eu num entendo de ponteiros não mais pq vc usou como ponteiro? pq num usou TRGBTripleArray de uma vez? o q ganha com isso?
se alguém poder me responder ficarei agradecido[/quote:3ee9873809]
Pelo que vi, é porque BitmapOriginal.Scanline[N] tambem retorna um pointer
Gostei dessa função! uma vez estava tentando fazer alguma coisa assim, mas não dava certo, agora me deparei com esse Scanline, o que ele faz? retorna um array com todos os pixels da linha?
E como a function é rápida!, comparando com as minhas tentativas anteriores :(
Ela funcionou muito bem, mas com alguns bitmaps ficava tudo manchado, alguem saberia porque?
GOSTEI 0
Cebikyn
08/08/2003
eu num entendo de ponteiros não mais pq vc usou como ponteiro? pq num usou TRGBTripleArray de uma vez? o q ganha com isso?
se alguém poder me responder ficarei agradecido
Sinceramente, eu não sei :oops: , eu apenas copiei a função de um programinha de exemplo...
[quote:41d7cf7e46=´Marcelo Saviski´]Gostei dessa função! uma vez estava tentando fazer alguma coisa assim, mas não dava certo, agora me deparei com esse Scanline, o que ele faz? retorna um array com todos os pixels da linha?[/quote:41d7cf7e46]
Sim, a função [i:41d7cf7e46]ScanLine[/i:41d7cf7e46] retorna os pixels da linha.
[quote:41d7cf7e46=´Marcelo Saviski´]Ela funcionou muito bem, mas com alguns bitmaps ficava tudo manchado, alguem saberia porque?[/quote:41d7cf7e46]
Talvez porque a função trabalha apenas com bitmaps de 24bits. Na linha de código [b:41d7cf7e46]RESULT.PixelFormat := pf24bit;[/b:41d7cf7e46] , vê-se que a função ´força´ o bitmap a ter este formato, se você estiver usando outro formato de bitmap, provavelmente esta aí o problema.
GOSTEI 0
Nildo
08/08/2003
Poderia me dar um exemplo de como utilizar esta funcao?
To tentando aki mas a imagem to ficando em branco...
Valews!
To tentando aki mas a imagem to ficando em branco...
Valews!
GOSTEI 0
Marcelo Saviski
08/08/2003
Já que eu tambem me beneficiei da ajuda que era inicialmente para o Nildo, vou retribuir, fiz uns testes e funcionou muito bem, [url=http://usuarios.lycos.es/marcelosaviski/arquivos/]clique aqui para pegar os fontes[/url] compactados com o winrar, que incrivelmente ficaram com 10 kb! , com o bitmap e tudo!
GOSTEI 0
Nildo
08/08/2003
Valew mesmo!!!
Eh sempre bom contar com o forum!
Eh sempre bom contar com o forum!
GOSTEI 0
Marcelo Saviski
08/08/2003
conforme me foi pedido, hospedei o arquivo em um lugar novo, para acessar basta usar o mesmo link na mensagem superior.
GOSTEI 0
Nildo
08/08/2003
269 dias depois.... 8)
GOSTEI 0
Gabriela
08/08/2003
Esse código está perdendo as pontas da imagem.
Alguém tem algum outro código que não perca?
Alguém tem algum outro código que não perca?
GOSTEI 0