GARANTIR DESCONTO

Fórum Girar em tantos graus? #173922

08/08/2003

0

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!


Nildo

Nildo

Responder

Posts

08/08/2003

Cebikyn

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].

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]


Responder

Gostei + 0

09/08/2003

Marcelo Saviski

O que é esse [color=red:75e4372f62]pRGBTripleArray [/color:75e4372f62]?


Responder

Gostei + 0

09/08/2003

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;



Responder

Gostei + 0

09/08/2003

Nildo

Valew!
Funciono!


Responder

Gostei + 0

10/08/2003

Robotizar

É 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


Responder

Gostei + 0

10/08/2003

Marcelo Saviski

[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?


Responder

Gostei + 0

10/08/2003

Cebikyn

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.


Responder

Gostei + 0

10/08/2003

Nildo

Poderia me dar um exemplo de como utilizar esta funcao?
To tentando aki mas a imagem to ficando em branco...

Valews!


Responder

Gostei + 0

10/08/2003

Marcelo Saviski

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!


Responder

Gostei + 0

11/08/2003

Nildo

Valew mesmo!!!
Eh sempre bom contar com o forum!


Responder

Gostei + 0

07/05/2004

Marcelo Saviski

conforme me foi pedido, hospedei o arquivo em um lugar novo, para acessar basta usar o mesmo link na mensagem superior.


Responder

Gostei + 0

07/05/2004

Nildo

269 dias depois.... 8)


Responder

Gostei + 0

14/01/2005

Gabriela

Esse código está perdendo as pontas da imagem.

Alguém tem algum outro código que não perca?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar