在處理打印,對方給我的是圖片的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圖片有什麼特殊的地方還真不清楚。