löste det med:
FileStream fs = new FileStream(filePath+1, FileMode.Open, FileAccess.ReadWrite);
img = System.Drawing.Image.FromStream(fs);
Mvh Marcus
1 svar · 1 238 visningar · startad av Sanji
hej! I min asp.net applikation har jag en funktion för att ladda upp en bild(logga som används på en utskrift) som ser ut så här:
if (imgUpload.PostedFile.ContentLength > 0)
{
if (imgUpload.PostedFile.FileName.Substring(imgUpload.PostedFile.FileName.LastIndexOf(".")) == ".jpg")
{
string filePath = Server.MapPath("~/Logos/") + currentUser.CompanyID.ToString() + ".jpg";
if (File.Exists(filePath+1))
{
File.Delete(filePath+1);
}
imgUpload.SaveAs(filePath+1);
img = System.Drawing.Image.FromFile(filePath+1); //System.Drawing.Bitmap.FromFile(filePath);
Size size = new Size(img.Width, img.Height);
if (img.Width > 600)
{
img = resizeImage(img, size);
this.saveJpeg(filePath, new Bitmap(this.img), 85L);
}
else
{
if (File.Exists(filePath))
{
File.Delete(filePath);
}
File.Copy(filePath+1, filePath);
}
}
else
{
Response.Redirect("Companies.aspx?ErrorFileExt=1");
return;
}
}
Response.Redirect("Companies.aspx");
funktionen för resize
private static System.Drawing.Image resizeImage(System.Drawing.Image imgToRezise, Size size)
{
int sourceWidth = imgToRezise.Width;
int sourceHeight = imgToRezise.Height;
float originalwidth = imgToRezise.Width;
float nPercentW = 600;
nPercentW = nPercentW / originalwidth;
int destWidth = (int) (sourceWidth * nPercentW);
int destHeight = (int) (sourceHeight * nPercentW);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((System.Drawing.Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToRezise, 0, 0, destWidth, destHeight);
g.Dispose();
return (System.Drawing.Image)b;
}
Funktion för att spara som jpg och codec-inställningar
private void saveJpeg(string path, Bitmap img, long quality)
{
// Encoder parameter for image quality
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality);
// Jpeg image codec
ImageCodecInfo jpegCodec = this.getEncoderInfo("image/jpeg");
if (jpegCodec == null)
{
return;
}
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);
}
private ImageCodecInfo getEncoderInfo(string mimeType)
{
// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
// Find the correct image codec
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];
return null;
}
problemet jag har är att när jag laddat upp en bild och sedan försöker ladda upp en ny, så klagar den på första delete-koden:
if (File.Exists(filePath+1))
{
File.Delete(filePath+1);
}
Felmeddelandet säger att filen används av en annan process, så det går då inte att ta bort den. hur ska jag göra för att förhindra detta?
är det "img" som håller bilden öppen även efter att den har sparats?
Glömde att säga att filnamnet är användarens ID + .jpg, vilket betyder att de sparas om med samma namn.
Mvh Marcus
löste det med:
FileStream fs = new FileStream(filePath+1, FileMode.Open, FileAccess.ReadWrite);
img = System.Drawing.Image.FromStream(fs);
Mvh Marcus