我正在努力上传并将该图片的缩略图副本保存在缩略图文件夹中。
我正在使用以下链接:
http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx
但是
newBMP.Save(directory + "tn_" + filename);
导致异常“GDI +中发生了一般错误。”
我试图在文件夹上给予权限,还试图在保存时使用新的单独的bmp对象。
修改:
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();
}
答案 0 :(得分:79)
从a构造Bitmap对象或Image对象时 文件,文件在对象的生命周期内保持锁定状态。作为一个 结果,您无法更改图像并将其保存回同一文件 它起源于哪里。 http://support.microsoft.com/?id=814675
A generic error occurred in GDI+, JPEG Image to MemoryStream
Image.Save(..) throws a GDI+ exception because the memory stream is closed
http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html
修改强>
只是从记忆中写下来......
保存到“中间”内存流,应该可以正常工作
e.g。试试这个 - 替换
Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
有类似的东西:
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);
}
}
答案 1 :(得分:35)
如果传递给Bitmap.Save()
的路径无效(文件夹不存在等),也会显示此错误消息。
答案 2 :(得分:9)
// Once finished with the bitmap objects, we deallocate them.
originalBMP.Dispose();
bannerBMP.Dispose();
oGraphics.Dispose();
这是一种你迟早会后悔的编程风格。早点敲门,你忘了一个。您没有处置 newBitmap 。在垃圾收集器运行之前,它会锁定文件。如果它没有运行,那么第二次尝试保存到同一个文件时,你将获得klaboom。 GDI +异常过于悲惨,无法提供良好的诊断,因此严重的头疼。除了提到这个错误的成千上万的可评论帖子之外。
始终赞成使用使用语句。即使代码抛出异常,也永远不会忘记处置对象。
using (var newBitmap = new Bitmap(thumbBMP)) {
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
}
虽然我们甚至不清楚为什么你甚至创建一个新的位图,但保存thumbBMP应该已经足够好了。 Anyhoo,用爱来给你的一次性物品一样。
答案 3 :(得分:6)
在我的情况下位图图片文件已存在于系统驱动器中,因此我的应用程序抛出了错误“GDI +中出现了一般错误”。
答案 4 :(得分:6)
检查您的文件夹保存图像的权限 右边cLick文件夹然后去:
属性>安全>编辑>添加 - 选择"每个人"并选中允许"完全控制"
答案 5 :(得分:4)
我在使用MVC应用程序时遇到了同样的问题 GDI + 中发生了一般性错误,我收到此错误是因为我写错了保存图片的路径,我更正了保存路径,它对我来说很好。
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.
喜欢这个 -
img1.Save(Server.MapPath("/Upload/test.png"), System.Drawing.Imaging.ImageFormat.Png);
答案 6 :(得分:2)
由于以下几点而发生GDI +异常
如果文件夹出现问题-请提供对应用程序的访问权限 如果缺少属性,则使用下面的代码
代码1
#include <iostream>
using namespace std;
int main(){
double x;
cin>>x;
}
代码2
using (Bitmap bmp = new Bitmap(webStream))
{
using (Bitmap newImage = new Bitmap(bmp))
{
newImage.Save("c:\temp\test.jpg", ImageFormat.Jpeg);
}
}
代码1和代码2不同
代码-1:,它将仅创建图像并可以在普通图像查看器上打开它
代码-2:使用代码
在图像编辑工具中打开图像使用代码1可以创建图像,但不分配图像标记。
答案 7 :(得分:1)
我使用FileStream工作,从这些得到帮助 http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html http://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);
答案 8 :(得分:1)
我总是检查/测试这些:
bin/Debug
;-))?除了此列表之外,我Bitmap.Save()
从未遇到任何问题。
答案 9 :(得分:0)
下面的代码解决了我的问题
pictureBox1.Image=myImage;
Bitmap bmp = new Bitmap(pictureBox1.Image);
bmp.Save("C:\\Users/super/Desktop/robin.jpg");
答案 10 :(得分:0)
我使用此解决方案
int G = 0;
private void toolStripMenuItem17_Click(object sender, EventArgs e)
{
Directory.CreateDirectory("picture");// هذه العملية للرسم بدون ان يحذف بقية الرسومات
G = G + 1;
FormScreen();
memoryImage1.Save("picture\\picture" + G.ToString() + ".jpg");
pictureBox1.Image = Image.FromFile("picture\\picture" + G.ToString() + ".jpg");
}
答案 11 :(得分:0)
:public void Save (string filename);
,这让我感到很惊讶,因为我们不必传递文件名,而必须传递文件名以及路径,例如:MyDirectory/MyImage.jpeg
,这里{{ 1}}实际上还不存在,但是我们的文件将以此名称保存。
这里的另一个重要点是,如果您在Web应用程序中使用MyImage.jpeg
,那么请同时使用Save()
和Server.MapPath()
,它基本上只是返回传入的虚拟路径的物理路径。 :image.Save(Server.MapPath("~/images/im111.jpeg"));
答案 12 :(得分:0)
除了相同的例外,我遇到了另一个问题。
简而言之:
在调用Bitmap
之前,请确保没有处置Stream
的对象.Save
。
完整故事:
有一种方法返回了Bitmap
对象,该对象是通过以下方式从MemoryStream
构建的:
private Bitmap getImage(byte[] imageBinaryData){
.
.
.
Bitmap image;
using (var stream = new MemoryStream(imageBinaryData))
{
image = new Bitmap(stream);
}
return image;
}
然后有人使用返回的图像将其另存为文件
image.Save(path);
问题在于,当尝试保存图像时,原始流已被丢弃,并抛出GDI +片段。
此问题的一种解决方法是返回Bitmap
而不处理流本身,而是返回的Bitmap
对象。
private Bitmap getImage(byte[] imageBinaryData){
.
.
.
Bitmap image;
var stream = new MemoryStream(imageBinaryData))
image = new Bitmap(stream);
return image;
}
然后:
using (var image = getImage(binData))
{
image.Save(path);
}
答案 13 :(得分:0)
对我来说,这是保存图片时的路径问题。
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;
所以我通过添加以下正斜杠来修复它
String path = "images/savedimages....
应该是
String path = "/images/savedimages....
希望有助于任何人卡住!
答案 14 :(得分:0)
我在尝试将Tiff图像转换为Jpeg时遇到此错误。对我来说,问题源于tiff尺寸过大。任何高达62000像素的物体都可以,任何超过这个尺寸的物都会产生错误。
答案 15 :(得分:0)
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);
答案 16 :(得分:0)
对我来说这是一个许可问题。有人删除了运行应用程序的用户帐户的文件夹的写权限。
答案 17 :(得分:0)
在硬盘上创建文件夹路径图像/拇指=&gt;问题解决了!