打印預覽CA圖片 一片空白

在處理打印,對方給我的是圖片的Base64的字符串,但我發現,預覽時有單模糊,於是按照打印圖片模糊問題,進行了處理,發現問題更大,預覽時,直接什麼都沒有了,並且後邊的任何打印也都不顯示了。但實際的打印是正常的。看來GIF圖片確實有特殊的地方

測試代碼

 private void PrintDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            string imgpath = @"D:\3_DHCNURMoudPrn11csfyjld_1.gif";
            Image img = Image.FromFile(imgpath);          
            Graphics g = e.Graphics;
          string Base64String =  ImgToString(img);
            Image img2 = StringToImage(Base64String);
          //  img2 = ChangeColor(img2,Color.Black);
            g.DrawImage(img2, 350, 350, 500, 500);
            Pen pBlue = new Pen(Color.Black, 1);
            g.DrawLine(pBlue, 550, 0, 550, 500);
            e.HasMorePages = false;
        }
        public static Image StringToImage(string imgstr)
        { //字符串--〉流
            if (string.IsNullOrEmpty(imgstr))
            {
                return null;
            }
            Image Image = null;
            byte[] ImageBytes = Convert.FromBase64String(imgstr);//再將字符串分拆成字節數組
            using (MemoryStream stream = new MemoryStream(ImageBytes))////將字節數組保存到新的內存流上
            {
                Image = Image.FromStream(stream);//將內存流保存成一張圖片
            }
            //  SaveImg(ImageBytes);
            return Image;
        }
       
        public static string ImgToString(Image img)
        {
            string ImageStr = string.Empty;
            using (MemoryStream stream = new MemoryStream())//定義一個內存流
            {
                img.Save(stream, System.Drawing.Imaging.ImageFormat.Gif);//Gif圖片印預覽時有問題的
                // img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);//png圖片打印預覽時沒有問題的
                byte[] ImageBytes = stream.ToArray();//將內存流保存到字節數組中
                ImageStr = Convert.ToBase64String(ImageBytes);//將字節數組拼成字符串
            }
            return ImageStr;
        }

 

  最後經過測試,發現所有的GIF圖片都存在這個問題。但相同的圖片通過調用調用一個特殊的方法,預覽就沒有問題。

 /// <summary>
        /// 醫囑單的CA圖片打印會經過這個方法處理 Black
        /// 只用於CA簽名,把文字修改爲指定的顏色       
        /// </summary>
        /// <param name="SImage"></param>
        /// <param name="color"></param>
        /// <returns></returns>
        private static Bitmap ChangeColor(Image SImage, Color color)
        {          
            //0是黑色,255是白色
            int R = color.R;
            int G = color.G;
            int B = color.B;
            int Height = SImage.Height;
            int Width = SImage.Width;
            Bitmap bitmap = new Bitmap(Width, Height);
            Bitmap MyBitmap = (Bitmap)SImage;
          //  int change = 0;
          //  int changeNo = 0;
            for (int x = 0; x < Width; x++)
            {
                for (int y = 0; y < Height; y++)
                {
                    Color pixel1 = MyBitmap.GetPixel(x, y);
                    int a = pixel1.A;
                    int r = pixel1.R;
                    int g = pixel1.G;
                    int b = pixel1.B;
                    if(r + g + b >= 250 * 3)//250 * 3認爲時白色,完全透明的顏色
                    {
                   //     changeNo++;
                    }
                   else
                    {
                        r = R;
                        g = G;
                        b = B;
                        Color colorNew= Color.FromArgb(r, g, b);
                       // Color colorNew = Color.FromArgb(a, r, g, b);
                        bitmap.SetPixel(x, y, colorNew);
                    //    change++;
                    }                  
                }
            }
            return bitmap;
        }

至於GIF圖片有什麼特殊的地方還真不清楚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章