«Surveiller» une image

9

Le problème:

Ce défi vient d'un vrai problème que j'avais. J'ai une configuration à double moniteur au travail et je voulais utiliser l'image suivante comme fond d'écran:

Image idéale

Cependant, mes moniteurs ont des lunettes assez importantes, et quand je règle mon arrière-plan, cela ressemble à ceci, où la jetée semble (appiers?) Être cassée:

Issue Image

J'ai pu résoudre ce problème en créant une image avec le centre découpé, puis en l'étirant à sa taille d'origine, comme dans l'image ci-dessous:

Image du défi


Le défi:

Écrivez un programme qui prend une image et la «surveille» pour l'utiliser avec une configuration à deux moniteurs (c'est-à-dire supprime la section centrale de l'image, où se trouvent les lunettes). Les règles sont les suivantes:

  1. Il doit s'agir d'un programme complet qui accepte l'image, soit en tant que chemin (argument chaîne, etc.), soit sous la forme d'une boîte de dialogue de sélection de fichier.
  2. Le programme doit prendre en entrée le nombre de lignes verticales (un pixel de largeur) à recadrer à partir du centre de l'image
  3. Le recadrage doit provenir du centre (dans le sens de la largeur) de l'image originale
  4. L'image résultante doit être redimensionnée à la taille d'origine de l'image d'entrée. (Les moitiés peuvent être mises à l'échelle individuellement, puis concaténées, ou concaténées puis mises à l'échelle. La mise à l'échelle individuelle produit une meilleure image / effet, mais est à peine perceptible dans le monde réel)
  5. Les images d'arrière-plan sont généralement égales, donc pour faciliter ce défi, les images d'entrée n'auront qu'un nombre pair de pixels et le nombre de lignes à supprimer ne sera que pair.
  6. Ce défi est le golf de code - le code le plus court en octets gagne

Bonne chance!

dberm22
la source
2
1. Les images ne montrent pas très clairement ce qu'est l'opération, car elles sont mises à l'échelle à la même largeur. Peut-être remplacer la première et la dernière par des images de la même taille que celle du milieu et rembourrées de blanc? 2. Peut-on utiliser n'importe quelle forme de rééchelonnement (linéaire est probablement le moins cher) ou doit-il être spécifique (par exemple cubique, sinc, etc.)?
Peter Taylor
@PeterTaylor Conformément à la règle 3, les images d'entrée et de sortie sont censées avoir la même largeur. Soit chaque moitié est redimensionnée à la moitié de la largeur d'origine, puis concaténée, soit les moitiés recadrées sont concaténées, puis redimensionnées à la taille d'origine. Et oui, toute mise à l'échelle est très bien.
dberm22
La phrase commençant par "Peut-être" était une suggestion sur la façon de rendre la question plus facile à comprendre, et non une interprétation suggérée du défi. J'ai fait le changement moi-même.
Peter Taylor
@PeterTaylor Ahh, je vois, cela le rend plus clair. Merci.
dberm22
Peut-on supposer que l'image sera orientée paysage?
Scott Milner

Réponses:

1

Octave, 85 octets

@(f,n)imsave(imresize((o=imread(f))(:,[1:(end-n)/2,(end+n)/2:end],:),size(o)(1:2)),f)

Définit une fonction anonyme avec fle nom de fichier et nle nombre de colonnes à supprimer. Puisqu'une fonction anonyme nécessite une seule expression, l'affectation en ligne est utilisée, une fonctionnalité non présente dans MATLAB.

MATLAB, 98 octets

En prime, j'ai également joué une réponse compatible MATLAB. Fait intéressant, cela ne fait que 13 octets de plus, car la version Octave a besoin de beaucoup de parenthèses pour analyser correctement les affectations en ligne.

function  m(f,n)
o=imread(f);imsave(imresize(o(:,[1:(end-n)/2,(end+n)/2:end],:),size(o(:,:,1))),f)
Sanchises
la source
5

Matlab 2013, 150 octets

Voici ma tentative en Matlab. Ce ne sera certainement pas le code le plus court, mais c'est un début.

Attention, cela écrase l'image d'origine, donc faites d'abord une copie.

Version golfée

function  mi(f,n)
o=imread(f);
s=size(o);
imwrite([imresize(o(:,1:((s(2)-n)/2),:),[s(1),s(2)/2]) imresize(o(:,((s(2)+n)/2):end,:),[s(1),s(2)/2])], f);
end

Code non golfé, avec des améliorations pour les tailles d'image impaires et le nombre impair de colonnes

function  monitorizeImage( filename, num_columns )

orig = imread(filename);
orig_size = size(orig);

f = factor(orig_size(2));
origsize_iseven = f(1)==2;

f = factor(num_columns);
num_columns_iseven = f(1)==2;

odd_even_size_mismatch = xor(origsize_iseven,num_columns_iseven);

img_resized = imresize(orig,[orig_size(1) orig_size(2)+odd_even_size_mismatch]);

leftimg = img_resized(:,1:((orig_size(2)+odd_even_size_mismatch-num_columns)/2),:);
leftimg = imresize(leftimg,[orig_size(1),floor(orig_size(2)/2)]);
rightimg = img_resized(:,((orig_size(2)-odd_even_size_mismatch+num_columns)/2):end,:);
rightimg = imresize(rightimg,[orig_size(1),floor(orig_size(2)/2)]);

monitorized_image = [leftimg rightimg];
monitorized_image = imresize(monitorized_image,[orig_size(1),orig_size(2)+ ~origsize_iseven]);

[~, ~, ext] = fileparts(filename); 

imwrite(monitorized_image,strcat(filename(1:end-length(ext)),'_',num2str(num_columns),ext));

end
dberm22
la source
Juste pour ajouter à cela: les réponses aux défis doivent faire une tentative sérieuse d'optimisation pour le critère de notation donné. Dans un défi de code-golf comme celui-ci, cela signifie que toute amélioration évidente qui réduirait la longueur du code doit être apportée.
Essayez de supprimer les espaces et les espaces inutilisés.
dkudriavtsev
@ ais523 Merci. Jusqu'à 220 octets!
dberm22
De plus, chaque variable à deux octets est une de trop. La lisibilité n'est pas importante, alors refactorisez osetc. à n'importe quelle autre lettre de l'alphabet! Et pourquoi ne pas simplement réécrire l'image sur l'image d'entrée fpour sauvegarder le tout strcat? (que, incidemment, vous pouvez remplacer par ['',...]plutôt que strcat(...))
Sanchises
@Sanchises Merci, c'était un reste de la version non golfée / améliorée. Rien dans les règles n'indiquait qu'il ne pouvait pas écraser ou qu'il fallait avoir des sorties assez nommées. Merci ... qui a diminué le nombre d'octets de 70 octets!
dberm22
3

Langue Wolfram, 134 , 127 , 119 111 octets

f[i_,c_]:=(d=ImageDimensions@i;ImageAssemble[ImageTake[i,a=All,#]&/@{{0,e=-#&@@d/2-c/2},{-e,a}}]~ImageResize~d)

Crée une fonction fqui prend une image comme première entrée (comme symbole dans Mathematica ou Wolfram Cloud) et un entier comme deuxième entrée.

Non golfé :

f[image_,columns_]:=(  (*Define Function*)
    d=ImageDimensions[image];  (*Get image dimensions*)
    e=d[[1]]/2+columns/2;  (*Add half the image width to half the number of removed columns*)
    ImageResize[ImageAssemble[Map[ImageTake[i,All,#]&,{{0,-e},{e,All}}]],d]  (*Map the function onto a list with the desired column ranges and merge and scale the resulting image*)
)

Techniquement, cela ne fonctionnera pas correctement si l'une des dimensions de l'image dépasse 362 880 pixels, mais je suppose que c'est correct, car c'est bien en dehors de la portée du problème (et de certains ordinateurs). Fixé!

Scott Milner
la source
2

PHP, 206 octets

($c=imagecopyresized)($t=imagecreatetruecolor($w=imagesx($s=imagecreatefrompng($argv[1])),$h=imagesy($s)),$s,0,0,0,0,$v=$w/2,$h,$x=$v-$argv[2]/2,$h);$c($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);imagepng($t,$argv[3]);

prend trois arguments de ligne de commande: nom du fichier source, nombre de lignes à rogner et nom du fichier cible. Courez avec -r.

Vous voudrez peut-être utiliser à la imagecopyresampledplace de imagecopyresized(+2 octets) pour un meilleur résultat.

non golfé

$s=imagecreatefrompng($argv[1]);    # load source image
$w=imagesx($s);$h=imagesy($s);      # get image dimensions
$t=imagecreatetruecolor($w,$h);     # create target image
$v=$w/2;                            # $v = half width
$x=$v-$argv[2]/2;                   # $x = width of remaining halves
                                    # resize and copy halves:
imagecopyresized($t,$s, 0,0,    0,0,$v,$h,$x,$h);
imagecopyresized($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);
imagepng($t,$argv[3]);              # save target image

Je pourrais économiser 9 octets de plus en envoyant le résultat PNG à STDOUT ... mais pour quoi faire?

Titus
la source
"Je pourrais économiser 9 octets de plus en envoyant le résultat PNG à STDOUT ... mais pour quoi faire?" Ensuite, vous pourriez exécuter quelque chose comme php -r image.php image.png 1 > output.png, non?
ʰᵈˑ