我从数据库中提取了一个用户上传的图像,我正在调整大小以显示在我打算打印的网页上。我想在用户上传时保存一个较小的版本,但由于该文档的设计尚未最终确定,我正在寻找更具动态性的东西。此外,此文档只需打印一次,而上传的图像会多次显示在应用程序的各个位置。
使用javascript调整大小,同时保持其比例,它打印正常一段时间。添加样式边距后,打印机开始以完整尺寸打印图像。我假设它是保证金。它在屏幕上看起来很好,但在纸上将所有内容都推开。
这导致我在C#代码中调查它在服务器上的大小,但我们使用上传到数据库的用户图像,我似乎无法在页面生命周期中找到合适的时间或地点来访问并改变宽度和高度。我已经尝试使用Bitmaps在网络上使用各种方法,但是当我使用FileDownloader页面作为图像网址时,它们都需要一个文件。
也许我完全在错误的地方寻找并需要回到客户端。建议和帮助表示赞赏。
答案 0 :(得分:0)
你能实施这样一个过程吗?
编辑:
我同意你在这里得到的大多数回复。
如果图片存储在数据库中,您需要先为所有图片制作拇指图并将它们放在同一个数据库中,然后您需要实现一个过程,以便在添加新图片时动态创建缩略图。
答案 1 :(得分:0)
当你不得不将图像的大小调整为已知的约束时,并且有可能不得不多次这样做时,我总是提倡一次调整大小(上传时)并存储结果。当然,您并不是说您需要保留原始图像大小,但如果这样做,则只需将图像存储两次 - 一次是原始大小,一次是调整大小的尺寸。
完成后,您可以根据已调整大小的图像的已知尺寸来定义打印版面,而不必为每次使用调整大小。
答案 2 :(得分:0)
如果您想让用户点击完整图片,我建议转换上传并保存两张图片。使用此模型,您只需执行一次转换,并可以渲染任一尺寸的图像。 Image类上的GetThumbnailImage()方法将按照您的意愿执行,如下所示:
String imageFile = uploadedFileName;
Image baseImage = Image.FromFile(imageFile);
Image thumbImage = baseImage.GetThumbnailImage(300,300,..., ...);
SaveMyImage(baseImage);
SaveMyImage(thumbImage);
请务必查看GetThumbnailImage()参数的文档,以验证扩展问题和回调处理。
答案 3 :(得分:0)
只要您的FileDownloader页面返回正确的已调整大小的图像,您就不会指向实际图像。
我在你的FileDownloader页面(伪代码)中有这样的东西:
using (Image img = LoadImageFromDatabase())
{
using (Image resized = ResizeImage(img))
{
Response.Clear();
// Set proper headers
using (MemoryStream ms = new MemoryStream())
{
resized.Save(ms); // maybe the function isn't called Save, can't remember a 100%
ms.Seek(0); // Can't remember if this is necessary
Response.BinaryWrite(ms);
}
}
}
就像我提到它是高度伪代码一样,但它应该是直接打开Visual Studio,我现在还没有访问它,自从我上次使用它以来已经有一段时间了(因为我是在这个问题推荐中存储调整大小的图像就像大多数其他图像一样 - 我这样做也是如此,但我意识到这不是你的选择)
答案 4 :(得分:0)
免责声明:我建议我为此目的设计的开源库。我绝对有偏见,但4年和成千上万的快乐用户证明了我的偏见:)
您不应该在.ASPX页面内调整图像大小,也不应该为它们提供服务。图像应由HttpModule在单独的请求中处理,因此响应性不会受到影响。
如果您在每个图像的SQL中都有某种ID,则可以使用the SqlReader VirtualPathProvider通过URL访问它,例如/ sqlimages / id
将其与this free, open-source dynamic image resizing module相结合,然后就可以了。
您只需从HTML中引用如下图像:http://localhost/sqlimages/id?width=300&height=200,您甚至不必编写一行C#。
如果您编写自己的解决方案read these 28 pitfalls you should avoid,那么您最终不会崩溃服务器。
希望这有帮助!