C# images Redimensionnées ont des bordures noires
J'ai un problème avec l'image mise à l'échelle .NET. J'utilise le standard le type de Graphique pour redimensionner les images comme dans cet exemple:
public static Image Scale(Image sourceImage, int destWidth, int destHeight)
{
Bitmap toReturn = new Bitmap(sourceImage, destWidth, destHeight);
toReturn.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
using (Graphics graphics = Graphics.FromImage(toReturn))
{
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.DrawImage(sourceImage, 0, 0, destWidth, destHeight);
}
return toReturn;
}
Mais j'ai un gros problème avec les images redimensionnées: ils ont le gris et le noir des frontières et il est extrêmement important de le faire pour avoir des images sans eux.
Pourquoi apparaissent-ils et ce que je peux faire les faire disparaître?
Exemple De Sortie:
Quel est le code HTML ressembler à ce qui est envoyé au navigateur pour ces images?
Qu'est-ce que le type d'origine de l'image?
postez votre image d'entrée
J'ai eu le même problème et posté ma solution.
L'image n'est plus, mais si vous avez été voir un 1px bordure sur le bord, à vous de les corriger que par le passage d'un ImageAttributes instance de DrawImage() avec TileFlipXY ensemble. Que fait le interplation la réutilisation de l'extérieur de pixel du bord d'attaque au lieu de la moyenne contre l'arrière-plan ou la couleur de transparence. Source: imageresizing.net
Qu'est-ce que le type d'origine de l'image?
postez votre image d'entrée
J'ai eu le même problème et posté ma solution.
L'image n'est plus, mais si vous avez été voir un 1px bordure sur le bord, à vous de les corriger que par le passage d'un ImageAttributes instance de DrawImage() avec TileFlipXY ensemble. Que fait le interplation la réutilisation de l'extérieur de pixel du bord d'attaque au lieu de la moyenne contre l'arrière-plan ou la couleur de transparence. Source: imageresizing.net
OriginalL'auteur Ievgen Naida | 2009-12-07
Vous devez vous connecter pour publier un commentaire.
Essayer:
L'Art, c'est votre source de 24-bits ou 32-bits avec canal alpha? Redimensionnement d'une image avec alpha entraînera des pixels semi-transparents par les bords; par le réglage de ce mode de ces pixels sera mélangé avec le fond, autrement ils sont mélangés avec du noir de sorte que les frontières. Je ne sais pas ce qui se passe avec les images 24 bits.
Rançon, Voir ma réponse, vous êtes partiellement droit, mais ne lui donne pas la bonne solution.
A fonctionné pour moi! Merci!
Ne fonctionne pas pour moi #nCurses
OriginalL'auteur Mark Ransom
Cela peut être causé par des pixels sur les bords à tort interpolées. Je dirais que c'est un bogue.
Voici la solution:
Ce que ce n'est le premier dessin de "fond" avec les bords correctement rempli, et puis de dessiner à nouveau avec interpolation. Si vous n'avez pas besoin d'interpolation, alors ce n'est pas nécessaire.
Pas de problème 🙂 sachez cependant que c'est, mais efficace, pas de la solution la plus optimale, en terme de performance. Il ne devrait pas beaucoup d'importance, sauf si vous avez une très grande quantité d'images, ou vous faites un composant personnalisé à être distribué, ré-utilisé, etc., où vous voudrez peut-être une méthode plus complexe de la fixation de ce, telles que l'utilisation de lockbits et le dessin/interpolant "manuellement".
OriginalL'auteur Camilo Martin
La vraie solution est d'utiliser une surcharge de la
DrawImage
qui vous permet de passer unImageAttributes
objet.Sur le
ImageAttributes
exemple, appeler la méthode suivante avant de passer àDrawImage
:Voir aussi cette réponse
C'est la vraie solution à ce problème.
J'ai essayé de résoudre ce problème pendant environ 3 heures. Cette réponse est la seule qui a fonctionné. Je souhaite que cela a été la solution retenue.
OriginalL'auteur marapet
Le problème réside dans le fait que votre image bitmap
toReturn
a un fond noir par défaut.Copie d'une nouvelle image, plus il fait noir ou gris frontières.
La solution est de supprimer le noir en arrière-plan par défaut, en appelant:
Puisqu'à la suite de cette ligne, vous serez en s'appuyant sur une nouvelle image sans couleur d'arrière-plan, les frontières disparaissent.
OriginalL'auteur Jeroen
C'est parce que l'échantillonnage a été prise à partir du bord de la photo.
OriginalL'auteur Chuck Conway
Comment les travaux suivants pour vous? C'est le code que j'ai utilisé pour faire la même chose. La principale différence que je remarque c'est que je n'utilise pas SetResolution (et je suppose que d'une place d'entrée et de sortie, puisque c'était le cas pour moi).
OriginalL'auteur Dov
C'est à cause de la fonction de lissage (fusion avec l'arrière-plan) sur les bords lors de l'élaboration de l'image.
Vous pourrait peut-être tirer deux fois, une fois sans et un avec le lissage est activé. Ou vous pouvez dessiner un peu plus gros. Ou si la couleur de fond d'origine est connu, vous pourriez d'abord remplir l'image avec la couleur d'arrière-plan.
OriginalL'auteur Lucero
Aucun de ces fonctionné pour moi.
Toutefois, la modification du format de
à
ont permis de résoudre le problème
OriginalL'auteur Stefan Steiger
Une réponse correcte peut être reconstitué à partir de certains des autres réponses, mais aucune n'est complète, et certains présentent de très mauvaises idées (comme le dessin de l'image deux fois).
Il y a trois raisons pour les objets que vous voyez:
Graphics.PixelOffsetMode
paramètre, les valeurs des pixels échantillonnés de manière incorrecte, ce qui représente une légère distorsion de l'image, en particulier sur les bords.InterpolationMode.HighQualityBicubic
des échantillons de pixels de l'au-delà des bords de l'image, qui sont transparents par défaut. Ces pixels transparents sont mélangés avec les pixels de contour par l'échantillonneur, résultant en semi-transparent sur les bords.Que tous les ajoute à semi-noir (c'est à dire gris) bords.
La bonne façon d'enlever ces objets est d'utiliser
PixelOffsetMode.Half
et à l'utilisation d'unImageAttributes
objet pour spécifier bord de carrelage de sorte que leHighQualityBicubic
l'échantillonneur a quelque chose d'autre que les pixels transparents de l'échantillon.Il y a quelques problèmes avec le code que vous avez posté:
La
Bitmap
constructeur que vous avez utilisé est l'initialisation de la nouvelleBitmap
par le redimensionnement de l'image d'origine, de sorte que vous êtes en train de faire l'opération de redimensionnement deux fois. Vous devez utiliser une surcharge du constructeur avec juste les dimensions de votre choix pour créer une toile vierge.Rappelez-vous que le
Bitmap
classe représente un non géré copie de l'image dans la mémoire. Il doit être disposé de sorte que GDI+ peut être dit pour la libérer de la mémoire lorsque vous avez terminé avec elle. Je suppose que vous faites cela dans le code qui reçoit le retourImage
, mais que je signale au cas où quelqu'un d'autre emprunte ce code.La
CompositingQuality.HighQuality
paramètre utilisé dans votre code aura aucun effet visuel si vous obtenez les autres paramètres de la droite et sera effectivement nuire à la performance de manière assez significative en combinaison avec la valeur par défaut deCompositingMode.SourceOver
. Vous pouvez omettre leCompositingQuality
paramètre et valeurCompositingMode.SourceCopy
pour obtenir les mêmes résultats avec de meilleures performances.La
SmoothingMode
paramètre utilisé dans votre code n'a aucun impact surDrawImage()
, de sorte qu'il peut être supprimé.Vous pouvez en lire plus sur le
Graphics
les paramètres de la classe et de leur impact sur la qualité de l'image et de la performance ici: http://photosauce.net/blog/post/image-scaling-with-gdi-part-3-drawimage-and-the-settings-that-affect-itLa version révisée du code devrait ressembler à quelque chose comme ceci:
OriginalL'auteur saucecontrol