Ich arbeite gerade an dem Hochladen und Speichern einer Miniaturansicht dieses Bildes in einem Miniaturordner.
Ich verwende folgenden Link:
http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx
aber
newBMP.Save(directory + "tn_" + filename);
verursacht die Ausnahme "Ein generischer Fehler ist in GDI + aufgetreten."
Ich habe versucht, die Erlaubnis für den Ordner zu erteilen, ich habe auch versucht, beim Speichern ein neues separates BMP-Objekt zu verwenden.
Bearbeiten:
protected void ResizeAndSave(PropBannerImage objPropBannerImage)
{
// Create a bitmap of the content of the fileUpload control in memory
Bitmap originalBMP = new Bitmap(fuImage.FileContent);
// Calculate the new image dimensions
int origWidth = originalBMP.Width;
int origHeight = originalBMP.Height;
int sngRatio = origWidth / origHeight;
int thumbWidth = 100;
int thumbHeight = thumbWidth / sngRatio;
int bannerWidth = 100;
int bannerHeight = bannerWidth / sngRatio;
// Create a new bitmap which will hold the previous resized bitmap
Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight);
Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight);
// Create a graphic based on the new bitmap
Graphics oGraphics = Graphics.FromImage(thumbBMP);
// Set the properties for the new graphic file
oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
// Draw the new graphic based on the resized bitmap
oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight);
Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
// Save the new graphic file to the server
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
oGraphics = Graphics.FromImage(bannerBMP);
// Set the properties for the new graphic file
oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
// Draw the new graphic based on the resized bitmap
oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight);
// Save the new graphic file to the server
bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg");
// Once finished with the bitmap objects, we deallocate them.
originalBMP.Dispose();
bannerBMP.Dispose();
oGraphics.Dispose();
}
Wenn entweder ein Bitmap-Objekt oder ein Image-Objekt aus einem .__ erstellt wird. Datei bleibt die Datei für die Lebensdauer des Objekts gesperrt. Als ein Daher können Sie ein Bild nicht ändern und es in derselben Datei speichern. wo es entstanden ist . http://support.Microsoft.com/?id=814675
Ein generischer Fehler ist in GDI +, JPEG-Bild in MemoryStream aufgetreten.
Image.Save (..) löst eine GDI + -Ausnahme aus, da der Speicherstrom geschlossen ist
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html
EDIT:
nur aus dem Gedächtnis schreiben ...
speichern Sie in einem "intermediären" Speicher-Stream, der funktionieren sollte
z.B. versuchen Sie es mit diesem - ersetzen
Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
mit so etwas wie:
string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
{
thumbBMP.Save(memory, ImageFormat.Jpeg);
byte[] bytes = memory.ToArray();
fs.Write(bytes, 0, bytes.Length);
}
}
Diese Fehlermeldung wird auch angezeigt, wenn der Pfad, den Sie an Bitmap.Save()
übergeben, ungültig ist (Ordner existiert nicht usw.).
// Once finished with the bitmap objects, we deallocate them.
originalBMP.Dispose();
bannerBMP.Dispose();
oGraphics.Dispose();
Dies ist ein Programmierstil, den Sie früher oder später bereuen werden. Früher klopft es an der Tür, Sie haben eine vergessen. Sie verfügen nicht über newBitmap. Dadurch bleibt die Datei gesperrt, bis der Speicherbereiniger ausgeführt wird. Wenn dies nicht der Fall ist, erhalten Sie beim zweiten Versuch, in derselben Datei zu speichern, den Klaboom. GDI + -Ausnahmen sind zu miserabel, um eine gute Diagnose zu geben, sodass ernsthaftes Kopfkratzen entsteht. Über die Tausenden von googlable Posts hinaus, die diesen Fehler erwähnen.
Immer favor mit der Anweisung mit der Anweisung. Das vergisst nie, ein Objekt zu entsorgen, selbst wenn der Code eine Ausnahme auslöst.
using (var newBitmap = new Bitmap(thumbBMP)) {
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
}
Obwohl es sehr unklar ist, warum Sie überhaupt eine neue Bitmap erstellen, sollte das Speichern von thumbBMP bereits gut genug sein. Wie auch immer, geben Sie dem Rest Ihrer Einwegobjekte dasselbe mit Liebe.
Überprüfen Sie die Berechtigung Ihres Ordners, in dem das Bild gespeichert ist Klicken Sie mit der rechten Maustaste auf den Ordner, und gehen Sie folgendermaßen vor:
Eigenschaften> Sicherheit> Bearbeiten> Hinzufügen - Wählen Sie "Alle" aus und aktivieren Sie "Vollzugriff zulassen".
Ich hatte das gleiche Problem Bei GDI + ist ein allgemeiner Fehler aufgetreten Beim Speichern während der Arbeit an der MVC-App trat dieser Fehler auf, weil ich einen falschen Pfad zum Speichern des Bildes schrieb. Ich korrigierter Speicherpfad) und es hat gut funktioniert für mich.
img1.Save(Server.MapPath("/Upload/test.png", System.Drawing.Imaging.ImageFormat.Png);
--Above code need one change, as you need to put close brackets on Server.MapPath() method after writing its param.
So was-
img1.Save(Server.MapPath("/Upload/test.png"), System.Drawing.Imaging.ImageFormat.Png);
In meinem Fall war die Bitmap-Bilddatei bereits im Systemlaufwerk vorhanden , daher hat meine App den Fehler/geworfen "Ein generischer Fehler ist in GDI +" aufgetreten.
Ich habe es mit FileStream zum Laufen gebracht
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.htmlhttp://csharpdotnetfreak.blogspot.com/2010 /02/resize-image-upload-ms-sql-database.html
System.Drawing.Image imageToBeResized = System.Drawing.Image.FromStream(fuImage.PostedFile.InputStream);
int imageHeight = imageToBeResized.Height;
int imageWidth = imageToBeResized.Width;
int maxHeight = 240;
int maxWidth = 320;
imageHeight = (imageHeight * maxWidth) / imageWidth;
imageWidth = maxWidth;
if (imageHeight > maxHeight)
{
imageWidth = (imageWidth * maxHeight) / imageHeight;
imageHeight = maxHeight;
}
Bitmap bitmap = new Bitmap(imageToBeResized, imageWidth, imageHeight);
System.IO.MemoryStream stream = new MemoryStream();
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
stream.Position = 0;
byte[] image = new byte[stream.Length + 1];
stream.Read(image, 0, image.Length);
System.IO.FileStream fs
= new System.IO.FileStream(Server.MapPath("~/image/a.jpg"), System.IO.FileMode.Create
, System.IO.FileAccess.ReadWrite);
fs.Write(image, 0, image.Length);
Ich überprüfe/teste immer diese:
bin/Debug
;-))?Abgesehen von dieser Liste hatte ich nie Probleme mit Bitmap.Save()
.
Ich hatte ein anderes Problem mit derselben Ausnahme.
Zusamenfassend:
Stellen Sie sicher, dass das Objekt Bitmap
Stream
nicht gelöscht wird, bevor Sie .Save
aufrufen.
Ganze Geschichte:
Es gab eine Methode, die ein Bitmap
-Objekt zurückgab, das auf folgende Weise aus einer MemoryStream
erstellt wurde:
private Bitmap getImage(byte[] imageBinaryData){
.
.
.
Bitmap image;
using (var stream = new MemoryStream(imageBinaryData))
{
image = new Bitmap(stream);
}
return image;
}
dann hat jemand das zurückgegebene Bild verwendet, um es als Datei zu speichern
image.Save(path);
Das Problem bestand darin, dass der ursprüngliche Stream bereits beim Versuch, das Bild zu speichern, gelöscht wurde und die GDI + -Exception ausgelöst wurde.
Zur Behebung dieses Problems wurde die Bitmap
zurückgegeben, ohne den Stream selbst, sondern das zurückgegebene Bitmap
-Objekt zu entsorgen.
private Bitmap getImage(byte[] imageBinaryData){
.
.
.
Bitmap image;
var stream = new MemoryStream(imageBinaryData))
image = new Bitmap(stream);
return image;
}
dann:
using (var image = getImage(binData))
{
image.Save(path);
}
Legen Sie den Ordnerpfad image/thumbs auf Ihrer Festplatte an => Problem gelöst!
Dieser Fehler ist beim Versuch aufgetreten, Tiff-Bilder in JPEG zu konvertieren. Für mich bestand das Problem darin, dass die TIFF-Abmessungen zu groß waren. Alles, was bis zu 62000 Pixel betrug, war in Ordnung, alles oberhalb dieser Größe verursachte den Fehler.
I used below logic while saving a .png format. This is to ensure the file is already existing or not.. if exist then saving it by adding 1 in the filename
Bitmap btImage = new Bitmap("D:\\Oldfoldername\\filename.png");
string path="D:\\Newfoldername\\filename.png";
int Count=0;
if (System.IO.File.Exists(path))
{
do
{
path = "D:\\Newfoldername\\filename"+"_"+ ++Count + ".png";
} while (System.IO.File.Exists(path));
}
btImage.Save(path, System.Drawing.Imaging.ImageFormat.Png);
Für mich war es ein Erlaubnisproblem. Jemand hat Schreibberechtigungen für den Ordner für das Benutzerkonto entfernt, unter dem die Anwendung ausgeführt wurde.
von msdn: public void Save (string filename);
, was für mich ziemlich überraschend ist, da wir nicht nur den Dateinamen übergeben müssen, sondern den Dateinamen zusammen mit dem Pfad, zum Beispiel: MyDirectory/MyImage.jpeg
, hier existiert MyImage.jpeg
noch nicht, aber unsere Datei wird gespeichert mit diesem Namen.
Ein weiterer wichtiger Punkt ist, dass Sie bei Verwendung von Save()
in einer Webanwendung Server.MapPath()
zusammen mit dieser verwenden, die im Grunde nur den physischen Pfad für den übergebenen virtuellen Pfad zurückgibt. Beispiel: image.Save(Server.MapPath("~/images/im111.jpeg"));
für mich war es ein Pfadproblem beim Speichern des Bildes.
int count = Directory.EnumerateFiles(System.Web.HttpContext.Current.Server.MapPath("~/images/savedimages"), "*").Count();
var img = Base64ToImage(imgRaw);
string path = "images/savedimages/upImages" + (count + 1) + ".png";
img.Save(Path.Combine(System.Web.HttpContext.Current.Server.MapPath(path)));
return path;
Also habe ich den folgenden Schrägstrich hinzugefügt
String path = "images/savedimages....
sollte sein
String path = "/images/savedimages....
Hoffe, das hilft jedem, festzuhalten!