我正在构建一个程序,该程序生成图像并通过 REST 调用将它们作为 Base64 编码字符串发送到网页。所有图像均已生成并拉入,没有任何问题,除了迄今为止的一张图像。
我渲染了一张图像,尽管我努力对其进行编码/解码循环,但它似乎无法解码。我尝试过使用 .NET、Python 和各种 Base64 验证网站来查找是否可以正确解码由该图像生成的编码字符串,但我对可能发生的情况感到茫然。图像将保存看起来正确的结果的 .png,但任何将位图转换为 Base64 编码字符串的尝试都将导致字符串似乎无法加载到图像中。该字符串经过验证是正确的 base64 编码,并且编码过程在所有其他情况下都工作正常,但我需要知道正在渲染的图像有什么问题以及为什么它不能作为编码数据工作。
渲染这些图像的过程是从文件中提取原始图像,并根据用户参数进行裁剪和缩放。新更改的文件被编码为 base64 字符串并作为 REST 调用的结果发送。
这是我在 ASP.NET Core 中使用的代码:
private string GetResizedMapString(Map map, CanvasDisplaySettings disp)
{
string path = GetUploadPath(map.SourceName);
if (path != string.Empty)
{
Image srcImg = Image.FromFile(path);
RectangleF[] imgSizes = GetRenderAreas(srcImg, map, disp);
if (imgSizes != null)
{
Bitmap destImg = new((int)imgSizes[0].Width, (int)imgSizes[0].Height);
using var graphics = Graphics.FromImage(destImg);
graphics.DrawImage(srcImg, imgSizes[0], imgSizes[1], GraphicsUnit.Pixel);
// CREATING TESTING IMAGE AND ENCODED STRING FILES:
string testImgName = "TestImgFrom" + disp.DisplayID;
string filePath = Path.Combine(DepoCollection, testImgName);
String imageString = ConvertBitmapToString(destImg); // New Image String
String imageStringPath = filePath + ".txt"; // New Encoded String File
String imagePngPath = filePath + ".png"; // New Image File
// Save to PNG
destImg.Save(imagePngPath);
graphics.Dispose();
// Save to .txt to test the encoded string
using (StreamWriter outputFile = new StreamWriter(imageStringPath))
{
outputFile.WriteLine("data:image/png;base64," + imageString);
}
return imageString;
}
else return "";
}
}
static string ConvertBitmapToString(Bitmap bitmap)
{
// Convert the bitmap to a byte array
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] byteImage = ms.ToArray();
// Convert the byte array to a base64 string
string base64String = Convert.ToBase64String(byteImage);
return base64String;
}
这个过程已经适用于许多其他图像,并且缩放之前的原始图像能够被编码/解码。我尝试过使用 Python 进行类似的编码/解码过程,以及将图像加载到网上找到的其他 Base64 编码软件中。
程序生成的图像比源图像大得多,因此我无法在此处上传。我想知道为什么发生的事情会导致文件大小增加如此之多,以及是否可能相关。
源图像:1.34MB,2200 x 2200 像素
渲染图像:24.00 MB,2998 x 2998 像素
以下是渲染文件的 Google 云端硬盘链接:https://drive.google.com/file/d/1wxkWCEx3DyUG2yenWoEfOsi9QNEK38FK/view ?usp=sharing
感谢您提供有关正在发生的情况的任何线索以及有关如何避免这些问题的任何建议!
首先,大小问题可能与图像格式有关,在BMP中它几乎是原始的,并且大小可能是正确的,如果您在转换后要求 KB 大小,则在某些条件下应该使用Jpeg或Png 。
这个代码示例工作正常,除了它调用内存流缓冲区之外,我看不出与您的有太大区别。
请记住,您保存的是图像文件而不是位图对象,也就是说,您正在转换带有标题和可能的调色板等的结果文件。
另一件事,当您再次转换时,您应该在将图像保存到存储或将其上传到流以进行可视化之前删除标题: