Hello I have this tutorial to try to get an image compressed, however, when I use a profile photo with my phone(selfie) it just rotates 45 degrees.
What could be happening?
EDIT
I added the code to show you, so it is not necessary to click the link
private void VaryQualityLevel()
{
// Get a bitmap. The using statement ensures objects
// are automatically disposed from memory after use.
using (Bitmap bmp1 = new Bitmap(#"C:\TestPhoto.jpg"))
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
// Save the bitmap as a JPG file with 10 quality level compression.
myEncoderParameter = new EncoderParameter(myEncoder, 10L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"C:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters);
}
}
This is the other portion of code:
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
Related
I have a BMP image object which contains a BMP image, how can I convert it to JPEG format without saving to file?
All I need to know is the size of the JPEG file after the conversion, so If I have several BMP images, I want to convert each one of them into a JPEG and then see the size of each one.
How can I do that?
Thanks.
Just save it stream. and look size.
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
private void Form1_Load(object sender, EventArgs e)
{
Bitmap bmp1 = new Bitmap(#"C:\Users\ercan.acar\Pictures\Current CR Sticker.PNG");
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder =System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder,
50L);
myEncoderParameters.Param[0] = myEncoderParameter;
Stream stream=new MemoryStream();
bmp1.Save(stream, jpgEncoder,myEncoderParameters);
//bmp1.Save(#"C:\Users\ercan.acar\Documents\TestPhotoQualityFifty.jpg",);
var size = stream.Length;
}
How about using a nuget package like Magick.NET or similar.
Why reinventing the wheel and care about encoding, conversion adjustments, optimization if other have done this already for you.
I want to display an Image on a C# winForms application, but only with the quality of 50%, is it possible with the standard Picturebox?
Maybe resize the image programmatically to 50% of the size and then stretch it to the Picturebox?
Image img = Image.FromFile(imgFile)
** Resize the Image here, or do something else **
pictureBox.Image = img;
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
You can change the quality of Picture by following function,
private void VaryQualityLevel()
{
// Get a bitmap.
Bitmap bmp1 = new Bitmap(#"c:\TestPhoto.jpg");
ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder,
50L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"c:\TestPhotoQualityFifty.jpg", jgpEncoder,
myEncoderParameters);
myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"c:\TestPhotoQualityHundred.jpg", jgpEncoder,
myEncoderParameters);
// Save the bitmap as a JPG file with zero quality level compression.
myEncoderParameter = new EncoderParameter(myEncoder, 0L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"c:\TestPhotoQualityZero.jpg", jgpEncoder,
myEncoderParameters);
}
after assign 50% Quality Image on picture box,
pictureBox.Image = "c:\TestPhotoQualityFifty.jpg";
verify this stackoverflow.com/questions/1484759/quality-of-a-saved-jpg-in-c-sharp
I suggest you to first read this -
How to: Set JPEG Compression Level
Turning off JPEG color downsampling for Bitmap.Save()
You can save it to MemoryStream and then load a new bitmap from this
MemoryStream.
Try this approach:
// Get a bitmap.
Bitmap bmp1 = new Bitmap(#"c:\TestPhoto.jpg");
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
MemoryStream ms = new MemoryStream();
bmp1.Save(ms, jpgEncoder, myEncoderParameters);
pictureBox.Image = Image.FromStream(ms);
.....
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
Is it possible to set the compression level for a jpeg image in WebImage class? Or would i have to use the Image class for this?
You have to use the Image to compact it first. After compacted, you could use this on WebImage.
Here is a sample where I convert a base64 to image, but try to understand the compress logic (the 80L is the level of compression):
public MemoryStream Base64ToJpeg(string imgFoto)
{
Image imagemASerAjustada = null;
Bitmap bmpTemporario = null;
MemoryStream imagemCompactadaStream = new MemoryStream();
EncoderParameters myEncoderParameters = new EncoderParameters(1);
try
{
// removemos o cabeƧalho a respeito do tipo da imagem
string base64 = imgFoto.Substring(imgFoto.IndexOf(',') + 1);
base64 = base64.Trim('\0');
// convertemos em um array de bytes
byte[] img = Convert.FromBase64String(base64);
// transformamos a base64 em imagem
imagemASerAjustada = Image.FromStream(new MemoryStream(img));
// convertemos a imagem em Bitmap
bmpTemporario = new Bitmap(imagemASerAjustada, new Size(140, 140));
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
Encoder myEncoder = Encoder.Quality;
using (EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 80L))
{
myEncoderParameters.Param[0] = myEncoderParameter;
bmpTemporario.Save(imagemCompactadaStream, jpgEncoder, myEncoderParameters);
}
return imagemCompactadaStream;
}
catch
{
throw;
}
finally
{
if (imagemCompactadaStream.Length > 0)
{
imagemASerAjustada.Dispose();
bmpTemporario.Dispose();
myEncoderParameters.Dispose();
}
}
}
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
You can save the Stream in the WebImage(Stream)
I have this code that saves an image to disk
public static void SaveImage(Bitmap picture, string path)
{
// Comprimir
ImageCodecInfo encoder = GetJPGEncoder();
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
//picture.
picture.Save(path, encoder, myEncoderParameters);
}
but now I need to get the result as a byte[]. I can't find a way to get the result in memory so that I can convert it to byte[]. I thought about loading the file after saving it in the harddrive, but that would be completely unnecessary. Does anyone know if I can achieve this?
Use this:
using(var stream = new MemoryStream())
{
picture.Save(stream, encoder, myEncoderParameters);
return stream.ToArray();
}
Use a MemoryStream. One of the overloads of the Save() method takes a Stream.
I need to get a picture from the user, with different format extensions, and I want to always save it as "jpg", for easy handling.
is there a good way do that in c# without arming the quality?
From: http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoderparameter.aspx
private void VaryQualityLevel()
{
// Get a bitmap.
Bitmap bmp1 = new Bitmap(#"c:\TestPhoto.jpg");
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder,
50L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"c:\TestPhotoQualityFifty.jpg", jpgEncoder,
myEncoderParameters);
myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"c:\TestPhotoQualityHundred.jpg", jpgEncoder,
myEncoderParameters);
// Save the bitmap as a JPG file with zero quality level compression.
myEncoderParameter = new EncoderParameter(myEncoder, 0L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(#"c:\TestPhotoQualityZero.jpg", jpgEncoder,
myEncoderParameters);
}
...
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
I use this simple extension to convert a stream, all it does is convert it though and does nothing for quality.
public static Stream ConvertImage(this Stream originalStream, ImageFormat format)
{
var image = Image.FromStream(originalStream);
var stream = new MemoryStream();
image.Save(stream, format);
stream.Position = 0;
return stream;
}
usage:
var outputStream = gifStream.ConvertImage(ImageFormat.Png);
Windows GDI+ provides the Image class and the Bitmap class for storing
images in memory and manipulating images in memory. GDI+ writes images
to disk files with the help of image encoders and loads images from
disk files with the help of image decoders.
Check Image.Save Method overloads to implement your functionality. which support various image format of type ImageFormat Class.
follow example on Image.Save Method (String, ImageCodecInfo, EncoderParameters), which will let you save Jpg file with encoding etc.
code snippet:
using System;
using System.Drawing;
using System.Drawing.Imaging;
class Example_SetJPEGQuality
{
public static void Main()
{
Bitmap myBitmap;
ImageCodecInfo myImageCodecInfo;
Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
// Create a Bitmap object based on a BMP file.
myBitmap = new Bitmap("Shapes.bmp");
// Get an ImageCodecInfo object that represents the JPEG codec.
myImageCodecInfo = GetEncoderInfo("image/jpeg");
// Create an Encoder object based on the GUID
// for the Quality parameter category.
myEncoder = Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
myEncoderParameters = new EncoderParameters(1);
// Save the bitmap as a JPEG file with quality level 25.
myEncoderParameter = new EncoderParameter(myEncoder, 25L);
myEncoderParameters.Param[0] = myEncoderParameter;
myBitmap.Save("Shapes025.jpg", myImageCodecInfo, myEncoderParameters);
// Save the bitmap as a JPEG file with quality level 50.
myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
myBitmap.Save("Shapes050.jpg", myImageCodecInfo, myEncoderParameters);
// Save the bitmap as a JPEG file with quality level 75.
myEncoderParameter = new EncoderParameter(myEncoder, 75L);
myEncoderParameters.Param[0] = myEncoderParameter;
myBitmap.Save("Shapes075.jpg", myImageCodecInfo, myEncoderParameters);
}
// Codec info
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for(j = 0; j < encoders.Length; ++j)
{
if(encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
}
Hope this help..
Try this:
public static class BitmapExtension
{
public static void Save(this Bitmap bitmap, String fileName, ImageFormat imageFormat, long quality = 75L)
{
using (var encoderParameters = new EncoderParameters(1))
using (encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality))
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
bitmap.Save(fileName, codecs.Single(codec => codec.FormatID == imageFormat.Guid), encoderParameters);
}
}
}
...
Bitmap bitmap = new Bitmap("myImage.bmp");
bitmap.Save("myImage.jpg", ImageFormat.Jpeg, 50L);