# SimpleResize

## Abstrato

autor: Tom Barry
versão: 0.3.3.0
download: http://mywebpages.comcast.net/trbarry/downloads.htm
categoria: Resizers
requisitos: YV12 & YUY2 Colorspace

## Descrição

SimpleResize é um filtro Avisynth que faz uma interpolação linear de 2 tampas muito simples. É não filtrado, e significa que não suaviza muito.

`InterlacedResize` e `InterlacedWarpedResize` é projetado para trabalhar em material entrelaçado (mais ao fim do doc)

Sua vantagem principal é que roda um pouco mais rápido que alguns outros.

### Para usar:

Em seu arquivo Avisynth use comando semelhante para

    LoadPlugin("F:\SimpleResize\SimpleResize.dll")
    Avisource("D:\wherever\myfile.avi")
    SimpleResize(width, height)

E substitua o nome do arquivo e diretório com o seu próprio e dê os valores inteiros para width & height.

`SimpleResize` deva rodar em todas as máquinas de MX. Tem também alguns (opcional) códigos de instruções SSE2 para P4 e alguns de SSEMMX para P3 & Athlon, entretanto poderia usar talvez um pouco mais. Mas desculpe, nenhum plano para 3DNow extra.

### WarpedResize

`WarpedResize` também é incluído no SimpleResize.dll. `WarpedResize` `fará um` expandir / comprimir `não linear em ambas as dimensões horizontais e verticais.` Isto pode ser útil quando você quer mudar a relação de aspecto de um clipe de vídeo e principalmente torcer no alto, no fundo e nas extremidades laterais. Isto principalmente é experimental mas o incluí porque exigiu poucas mudanças de código e quase Zero penalidade em desempenho. Use como:

    LoadPlugin("F:\SimpleResize\SimpleResize.dll")
    AviSource("D:\wherever\myfile.avi")
    WarpedResize(width, height, hWarp, vWarp)

onde hWarp & vWarp são os fatores de deformações horizontais e verticais. Estes são números reais, normalmente entre .8 e 1.3 isso determina como você realmente quer a produção não linear.

Valores acima de 1.0 estira a produção da imagem mais no meio e apertado nas extremidades. Valores abaixo de 1.0 farão o contrário. Especificando 1.0 para qualquer um deles fará um resize linear naquela dimensão, da mesma maneira que com SimpleResize. Valores além de 1.0 darão alguns resultados muito estranhos. Veja as "Notas aos Matemáticos" abaixo.

Uma razão para usar WarpedResize é para quando tiver um clipe com uma relação de aspecto 16:9 e quiser redimensionar para uma exibição de relação de aspecto 4:3 sem cortar valiosas infos ou ter que exibir barras pretas. (ou vice-versa)

Um exemplo de imagem usando o WarpedResize pode ser achada (agora) em www.trbarry.com/WarpTest.jpg. Esta imagem era de uma curta captura digital HDTV com resolução de 1280x720, relação de aspecto16:9. Foi reduzida e deformada a 640x480 e relação de aspecto 4:3 usando o comando de escrito seguinte:

    WarpedResize(640,480,1.15,0.95))

Também, um exemplo de uma captura deformada 4:3 para ajustar em uma tela 16:9 veja www.trbarry.com/WarpTest2.jpg

### Atuais limitações, para SimpleResize/WarpedResize

1) Só cores modo YUY2 são suportadas atualmente. Coloque primeiro um comando ConvertToYuY2 se precisar.

2) A largura designada não deve ser mais um múltiplo de 4 píxeis.

3) Rodará mais rápido em máquinas SSE2 se a largura designada for um múltiplo de 8 píxeis e se o dados começa em um limite de 8 píxeis. Eu não sei se os comandos Clip() anteriores afetam isto ou não.

4) Se alguém souber fazer um filtro DirectShow assim, seguramente gostarei de ter um. ;-)

### Notas aos Matemáticos: (e perguntas)

Imagine a tela com dimensões de -1.0 a 1.0. Vamos considerar só a dimensão horizontal para o momento e só a metade direita da tela. Assuma que queremos calcular o valor de um píxel de produção em local x onde 0 <= x <=1.

O valor de saída será o valor de fonte da tela de entrada com as mesmas dimensões, no local s. Agora mesmo eu estou calculando apenas s = (1-w) * x^3 + w * x onde w é o fator de deformação mencionado acima (note depois: w = 2 - fator de deformação, para compatibilidade com a primeira versão). Isto faz o serviço e produz números lisos de 0 a um, sem muita distorção contanto que w esteja perto de 1.0.

A mesma fórmula é refletida para a metade esquerda da tela.

As equações de distorção são projetadas:

* Sempre está aumentando mas o rendimento é o resultado de 0 a 1

* Tenha um primeiro derivado que não vai a 0 ou infinito, pelo menos perto do centro da tela,

* Tenha uma curvatura (valor absoluto do 2º derivado) isso é pequeno no centro e sobe suavemente para as extremidades. Nós gostaríamos que a curvatura estivesse em todos lugares = 0 quando o fator de deformação = 1

Agora, tão próximo quanto eu posso contar a curvatura é mais ou menos só o valor absoluto do segundo derivado. Assim se nós quiséssemos a curvatura pequena quando x = 0 e crescer para as extremidades, o que poderia ser uma função de deformação útil? A função anterior já representa uma mudança desde V 0.1 mas ainda não estou tão seguro que é o melhor.

É fácil de soltar em outra função de deformação. E não há nenhuma penalidade de desempenho de qualquer modo porque apenas é calculado e tabelado no início. Depois disso roda à mesma velocidade de SimpleResize.

Alguém tem uma idéia? (Alguém se importa com esta parte?)

### InterlacedResize e InterlacedWarpedResize

Se você quer resize uma fonte entrelaçada você pode usar ao invés:

`InterlacedResize` (width, height)

ou

`InterlacedWarpedResize` (width, height, hWarp, vWarp)

Estes têm os mesmos parâmetros como antes mas são projetados para operar em fontes entrelaçadas, sem dados de mistura de iguais/diferentes ou desordenando as coordenadas por causa dessa linha de compensação. Teoricamente estes podem perder uma pequena quantia de detalhe vertical ou podem confundir um desentrelace subseqüente ou função IVTC mas de longe, em meu próprio teste, eu não acho que isso seja um problema.

Assim se você pretende manter seu vídeo em forma entrelaçada, certamente use estes. E se você está reduzindo pode achar que fazendo primeiro o InterlacedResize antes de um passo de desentrelace mais caro pode lhe dar uma pequena vantagem de desempenho em outro material. Mas isto ainda é experimental. YMMV.

`$Date: 2006/03/26 18:11:54 $ Portuguese translation by RoLon`