J'ai un problème lors de la mise à l'échelle d'une image. Le problème se présente lorsque l'image que j'essaie de mettre à l'échelle (original) est plus petite que la taille que j'essaie d'atteindre. Par exemple, une image ayant une largeur de 850 pixels et une hauteur de 700 pixels essayant d'être agrandie jusqu'à une largeur et une hauteur de 950 pixels. Par exemple, une image avec une largeur de 850 pixels et une hauteur de 700 pixels. L'image semble être mise à l'échelle correctement, mais elle est mal dessinée sur mon bitmap. Le code pour mettre à l'échelle l'image suivra. La largeur envoyée dans ScaleToFitInside est la largeur et la hauteur essayant d'atteindre 950px dans mon exemple.La mise à l'échelle de l'image ne fonctionne pas lorsque la taille et la largeur de l'image d'origine sont inférieures. La hauteur et la largeur de mise à l'échelle
public static Image ScaleToFitInside(Image image, int width, int height) {
Image reszied = ScaleToFit(image, width, height);
Bitmap bitmap = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bitmap)) {
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
Rectangle rect = new Rectangle(0, 0, width, height);
g.FillRectangle(Brushes.White, rect);
int x = (int)(((float)width - (float)reszied.Width)/2);
int y = (int)(((float)height - (float)reszied.Height)/2);
Point p = new Point(x, y);
g.DrawImageUnscaled(reszied, p);
foreach (PropertyItem item in image.PropertyItems) {
bitmap.SetPropertyItem(item);
}
}
return bitmap;
}
public static Image ScaleToFit(Image image, int maxWidth, int maxHeight) {
int width = image.Width;
int height = image.Height;
float scale = Math.Min(
((float)maxWidth/(float)width),
((float)maxHeight/(float)height));
return (scale < 1) ? Resize(image, (int)(width * scale), (int)(height * scale)) : image;
}
public static Image Resize(Image image, int width, int height) {
Bitmap bitmap = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bitmap)) {
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
Rectangle rect = new Rectangle(0, 0, width, height);
g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
foreach (PropertyItem item in image.PropertyItems) {
bitmap.SetPropertyItem(item);
}
}
return bitmap;
}
Ainsi, l'image devient mis à l'échelle, mais beeing tiré mal sur mon bitmap provoquant l'image à « tomber » en dehors de mon bitmap et ne présentant pas son auto ensemble.
Exemple: Lors de l'envoi des valeurs 2000x2000 (tentative de conversion). Ce qui suit arrive.
Étant donné que l'image d'origine est plus petite que les valeurs de migration, je ne veux pas la «rattraper», mais conserver la même taille. L'effet que je veux est de dessiner un rectangle avec la taille de 2000x2000 et dessiner l'image au centre de celui-ci.
Mon exemple l'image produit ces valeurs:
width = 2000; hauteur = 2000; redimensionné.La largeur sera de 1000 et redimensionnée.Hauteur sera 737 (taille des photos d'origine).
x = (2000 - 1000)/2 = 500; Lorsque vous dessinez ces valeurs sur un papier et que vous les associez au rectangle, il semble que ce soit les bonnes valeurs, mais l'image est toujours dessinée au mauvais endroit, et non dans le rectangle. le milieu du tout.
Merci d'avance.
hmms, cela ne peut pas être vrai. Lorsque je me déconnecte des variables dans le journal des événements, j'obtiens le résultat suivant. Image originale 640x480. Image essayant d'augmenter jusqu'à 1250x1300, puis x = 305 et y = 410 donc pas de valeurs négatives ici. – jinxen
Ensuite, je ne suis pas sûr de ce que les valeurs que vous passez: '(480 - 1300)/2 <0' – leppie
Dans mon image de test, j'envoie une largeur d'image de la largeur de 640 et la hauteur de 480. Si l'image en plus petit les mesures de la montée de l'image restera la même taille. Vous mettez les valeurs dans le mauvais ordre. La première variable est la valeur essayant d'upzise ou de downsize à beeing envoyé du webservice. Le resized.Height est la hauteur des images, également dans ce cas, l'image redimensionnée restera la même taille. Donc ce sera (1250 - 640)/2 et (1300 - 480). – jinxen