código para ampliar imagem em C

1. código para ampliar imagem em C

Pedro Victor
Nerdiarretado

(usa Arch Linux)

Enviado em 28/06/2019 - 13:27h

Saudações amigos(as)!
Estou com dificuldade em entender o que esse código faz. Quando digo entender é o que cada coisa faz, eu sei que ele irá ampliar a imagem, porém por qual motivo acontece isso ainda não entendi.


/*
larg = A largura da imagem
alt = altura da imagem
*/

void ampliar(Ptr_imagem ptr_imagem, int amp) {
// int amp é a variável que é usada para determinar o quanto será ampliado
Imagem imagemTemp;
imagemTemp.larg = ptr_imagem->larg * amp;
imagemTemp.alt = ptr_imagem->alt * amp;

alocarMemoria(&imagemTemp); // Alocação dinâmica para poder manipular a imagem, sem falhas de segmentação


// Aqui o bicho pega e não entendo mais nada
for (int i = 0, k = 0; i < ptr_imagem->alt && k < imagemTemp.alt; k++) {
if (k % amp == 0 && k != 0) {
i++;
}
for (int j = 0, l = 0; j < ptr_imagem->larg && l < imagemTemp.larg; l++) {
if (l % amp == 0 && l != 0) {
j++;
}
imagemTemp.pixel[k][l] = ptr_imagem->pixel[i][j];
}
}

free(ptr_imagem->pixel);
ptr_imagem->larg = imagemTemp.larg;
ptr_imagem->alt = imagemTemp.alt;
ptr_imagem->pixel = imagemTemp.pixel;
}



  


2. Re: código para ampliar imagem em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/07/2019 - 08:40h

Nerdiarretado escreveu:

Saudações amigos(as)!
Estou com dificuldade em entender o que esse código faz. Quando digo entender é o que cada coisa faz, eu sei que ele irá ampliar a imagem, porém por qual motivo acontece isso ainda não entendi.


É porque o código é mesmo meio esquisito. O autor escolheu um jeito bem estranho de fazer a transformação de um pixel em um quadrado de amp×amp pixels.

A construção “if (k % amp == 0 && k != 0) { i++; }” é uma forma ineficiente (porque operações de divisão e de cálculo de resto são computacionalmente caras, e também porque teria sido melhor testar primeiro se k é igual a zero, e depois o valor do cálculo do resto) de fazer com que o índice i da imagem original só se desloque a cada amp deslocamentos do índice k da imagem ampliada. E algo semelhante ocorre com os índices j e l.

Se fosse um programa meu, eu provavelmente teria feito do seguinte modo.

for(unsigned linha=0, linha_ampliada=0; linha<linhas_imagem_original; ++linha)    // Para cada linha da imagem original,
for(unsigned n=amp; n--; ++linha_ampliada) // processa, sucessivamente, amp linhas da imagem ampliada, nas quais,
for(unsigned coluna=0, coluna_ampliada=0; coluna<colunas_imagem_original; ++coluna) // para cada coluna da linha da imagem original,
for(unsigned m=amp; m--; ++coluna_ampliada) // processa, sucessivamente, amp colunas na linha da imagem ampliada.
imagem_ampliada[linha_ampliada][coluna_ampliada]=imagem_original[linha][coluna];



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts