尝试将Byte []转换为位图,但在c#中给出“参数无效”的错误

时间:2013-12-18 17:50:49

标签: c# bitmap

public class PrintPage
{        
    public void buildPdf(string url)
    {
        Bitmap bmp = PrintHelpPage(url);
        Document dc = new Document();
        PdfWriter pdfWrt = PdfWriter.GetInstance(dc, new FileStream(@"D:/Experiment/Sample.pdf", FileMode.Create));
        dc.Open();
        iTextSharp.text.Image pdfImage = iTextSharp.text.Image.GetInstance(bmp, System.Drawing.Imaging.ImageFormat.Jpeg);
        dc.Add(pdfImage);
        dc.Close();
    }
    private Bitmap PrintHelpPage(string url)
    {
        if (url.ToUpper()=="DEFAULT")
        {
            url = @"https://www.google.com";
        }
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        System.Text.Encoding Enc = System.Text.Encoding.GetEncoding(response.CharacterSet);
        StreamReader sr = new StreamReader(response.GetResponseStream(), Enc); 
        string sDoc = sr.ReadToEnd();               
        sr.Close();            
        byte[] by = Encoding.ASCII.GetBytes(sDoc);
        Bitmap bm = ByteToImage(by);            
        return bm;            
    }
    public static Bitmap ByteToImage(byte[] blob)
    {
        using (MemoryStream mStream = new MemoryStream())
        {
            mStream.Write(blob, 0, blob.Length);
            mStream.Seek(0, SeekOrigin.Begin);

            Bitmap bm = new Bitmap(mStream);
            return bm;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

编辑:评论之后:

  

实际上我试图捕获整个页面作为随机网站的图片转换为PDF

然后你会以错误的方式去做。您需要启动浏览器(例如System.Windows.Forms.WebBrowser)并以某种方式进行屏幕捕获。这将是非平凡的。同样重要的是,您了解为什么您当前的方法不起作用 - 它表明了对网络运作方式的基本误解。

原始回答

这是你最根本的问题:

System.Text.Encoding Enc = System.Text.Encoding.GetEncoding(response.CharacterSet);
StreamReader sr = new StreamReader(response.GetResponseStream(), Enc); 
string sDoc = sr.ReadToEnd();               
sr.Close();            
byte[] by = Encoding.ASCII.GetBytes(sDoc);

您正在阅读图片,就像它是一个文本文件一样。它不会。你会丢失这样的数据。

此外,您正在关闭传递给Bitmap构造函数的内存流 - 您不应该这样做。

您应该直接将响应流复制到MemoryStream,并将其用于Bitmap

MemoryStream stream = new MemoryStream();
using (var input = response.GetResponseStream())
{
    input.CopyTo(stream);
}
stream.Position = 0;
Bitmap bitmap = new Bitmap(stream);

哦,您还应该使用using语句进行响应,否则将无法处理,这可能会因连接池而导致未来请求超时。