image taille placée dans le tableau des octets [] (ne connaît pas le type d'image). Je dois produire un autre tableau des octets [], quelle taille devrait comporter jusqu'à 50 Ko. Comment puis-je faire une sorte de mise à l'échelle? P>
6 Réponses :
Je n'ai aucune implémentation définitive pour vous, mais je l'aborderais de cette façon:
Vous pouvez stocker 51200 valeurs (non comprimé). Et vous connaissez le ratio de l'original:
Calculez les dimensions avec le rapport et la taille de la nouvelle image: p> pour le rééchantillonnage des valeurs, je voudrais utiliser un noyau de filtre:
http://fr.wikipedia.org/wiki/lanczos_Resampling P> Haven 't l'a encore utilisé, mais semble prometteur. p> p>
sauf si vous voulez entrer dans des mathématiques graves, vous devez charger votre réseau d'octets dans un flux de mémoire, charger une image à partir de ce flux de mémoire et utiliser les fonctions GDI intégrées dans l'espace de noms System.Drawing.
Faire une échelle de 25% ou 50% est facile. Au-delà de cela, vous devez commencer à faire l'interpolation et à différencer pour que tout ressemblait à la moitié de la manipulation des données binaires. Vous serez plusieurs jours avant de pouvoir correspondre à ce qui est déjà disponible dans GDI. P> BTW - Si vous devez vraiment comprendre votre type d'image source, voir: < un href = "https://stackoverflow.com/questions/8349693/how-to-check-if-a-byte-array-is-a-valid-image"> Comment vérifier si un tableau d'octet est une image valide p> p>
Autre que l'ajout d'une instruction "Utilisation" sur les fonctions du flux, oui. Cela devrait être la réponse.
pas "A" en utilisant. 4 USings sont nécessaires là-bas. Bonne réponse cependant.
@Yazanpro - Je viens de vomir les fonctions pertinentes. Si vous voulez vous familiariser à un bloc digne de la production, soyez mon invité.
Cette approche fonctionnera-t-elle dans .NET CORE pour Linux? Pour autant que je sache, System.Drawing est un espace de noms spécifique à Windows qui ne fait pas partie de la .NET. Il est disponible uniquement comme un nuge séparé.
@Grigoryzhadko En savoir plus ici: Docs. microsoft.com/en-us/dotnet/api/... system.Drawing dépend de l'API GDI + spécifique à Windows. Vous pouvez obtenir une fonctionnalité sur Linux en utilisant System.Drawing.common avec Linux Package libgdxplus qui n'est pas installé sur la plupart des distributions.
Je suis utilisé ceci ....
public static byte[] ImagenToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
Comment cela fait-il le redimensionnement demandé dans la question?
OK, alors après quelques expériences, j'ai quelque chose comme ça: a une autre idée? Malheureusement image.GetthumbnailImage () causait des images très sales. P> p>
Comment la qualité des images du tableau d'octets est-elle? Est-ce que cela comprime correctement?
Supposons que vous lisiez un fichier à partir d'un fichier de lecteur
p>
FileStream streamObj = System.IO.File.OpenRead(@"C:\Files\Photo.jpg");
Byte[] newImage=UploadFoto(streamObj);
public static Byte[] UploadFoto(FileStream fileUpload)
{
Byte[] imgByte = null;
imgByte = lnkUpload(fileUpload);
return imgByte;
}
private static Byte[] lnkUpload(FileStream img)
{
byte[] resizedImage;
using (Image orginalImage = Image.FromStream(img))
{
ImageFormat orginalImageFormat = orginalImage.RawFormat;
int orginalImageWidth = orginalImage.Width;
int orginalImageHeight = orginalImage.Height;
int resizedImageWidth = 60; // Type here the width you want
int resizedImageHeight = Convert.ToInt32(resizedImageWidth * orginalImageHeight / orginalImageWidth);
using (Bitmap bitmapResized = new Bitmap(orginalImage, resizedImageWidth, resizedImageHeight))
{
using (MemoryStream streamResized = new MemoryStream())
{
bitmapResized.Save(streamResized, orginalImageFormat);
resizedImage = streamResized.ToArray();
}
}
}
return resizedImage;
}La solution pour .NET CORE 3.1 et plus:
System.Drawing.common code> Nuget: Li>
ol> xxx pré>
- Le code pour modifier la taille de l'image d'un tableau d'octets: LI>
ol>
xxx pré> update: strong>
L'approche ci-dessus ne peut pas fonctionner pour Linux. La solution universelle est donc la suivante: p>
- Installez
SIXLABORS.IMESSHARP CODE> Nuget: Li>
ol> xxx pré>
- Écrivez le code suivant: LI>
OL>
private static byte[] ReduceImage(byte[] bytes)
{
using var memoryStream = new MemoryStream(bytes);
using var image = Image.Load(memoryStream);
image.Mutate(x => x.Resize(ReducedWidth, ReducedHeight));
using var outputStream = new MemoryStream();
image.Save(outputStream, new PngEncoder() /*or another encoder*/);
return outputStream.ToArray();
}