c# - salen - que es mejor jpg o png para imprimir
¿Por qué el cambio de tamaño de una imagen PNG pierde transparencia? (3)
¿Has intentado utilizar la llamada .MakeTransparent()
en tu objeto de mapa de bits?
Estoy tratando de cambiar el tamaño de una imagen de la siguiente manera. Devuelvo la imagen redimensionada a byte[]
para que pueda almacenarla en la base de datos. La transparencia de la imagen png se pierde. Por favor ayuda a hacer esto mejor.
private byte[] GetThumbNail(string imageFile, Stream imageStream,
int imageLen)
{
try
{
Image.GetThumbnailImageAbort imageCallBack =
new Image.GetThumbnailImageAbort(ThumbnailCallback);
Bitmap getBitmap = new Bitmap(imageFile);
byte[] returnByte = new byte[imageLen];
Image getThumbnail = getBitmap.GetThumbnailImage(160, 59,
imageCallBack, IntPtr.Zero);
using (Graphics g = Graphics.FromImage(getThumbnail))
{
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.InterpolationMode =
System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(getThumbnail, 0, 0, 160, 59);
}
using (MemoryStream ms = new MemoryStream())
{
getThumbnail.Save(ms, ImageFormat.Png);
getThumbnail.Save("test.png", ImageFormat.Png);
returnByte = ms.ToArray();
}
return returnByte;
}
catch (Exception)
{
throw;
}
}
Tu código no hace exactamente lo que crees que hace ...
Utiliza GetThumbnailImage para cambiar el tamaño de la imagen, luego dibuja la imagen en miniatura en sí misma, lo cual es bastante inútil. Probablemente pierdas la transparencia en el primer paso.
Cree un mapa de bits en blanco y cambie el tamaño de la imagen de origen dibujándola en el mapa de bits en blanco.
private byte[] GetThumbNail(string imageFile) {
try {
byte[] result;
using (Image thumbnail = new Bitmap(160, 59)) {
using (Bitmap source = new Bitmap(imageFile)) {
using (Graphics g = Graphics.FromImage(thumbnail)) {
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(source, 0, 0, 160, 59);
}
}
using (MemoryStream ms = new MemoryStream()) {
thumbnail.Save(ms, ImageFormat.Png);
thumbnail.Save("test.png", ImageFormat.Png);
result = ms.ToArray();
}
}
return result;
} catch (Exception) {
throw;
}
}
(Eliminé algunos parámetros que nunca se usaron para nada que tuviera algo que ver con el resultado, como el parámetro imageLen que solo se utilizó para crear una matriz de bytes que nunca se usó).
Puede ser que debas hacer algo como esto porque esto funcionó para mí:
String path = context.Server.MapPath("/images");
if (!path.EndsWith("//"))
path += "//";
path += "none.png";
Image img = CreateThumbnail(Image.FromFile(path));
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Png);
ms.WriteTo(context.Response.OutputStream);
private System.Drawing.Image CreateThumbnail(System.Drawing.Image i)
{
int dWidth = i.Width;
int dHeight = i.Height;
int dMaxSize = 150;
if (dWidth > dMaxSize)
{
dHeight = (dHeight * dMaxSize) / dWidth;
dWidth = dMaxSize;
}
if (dHeight > dMaxSize)
{
dWidth = (dWidth * dMaxSize) / dHeight;
dHeight = dMaxSize;
}
return i.GetThumbnailImage(dWidth, dHeight, delegate() { return false; }, IntPtr.Zero);
}