如何使用Graphics类的DrawImage方法将大图像分割成较小的A4大小的片段

时间:2014-12-19 13:51:07

标签: c# graphics

Graphics类的DrawImage方法不能创建高质量的图像。在这种方法中,我将主图像分割成多个图像,但代码以非常低的质量生成第一个图像。但它为剩余高度生成全黑图像。

     public static Bitmap[] Split(byte[] ByteImage)
            {
    // MasterImage:  there is no problem in master image. it is saving it in good quality.
                MemoryStream ms = new MemoryStream(ByteImage);

                System.Drawing.Image MasterImage = System.Drawing.Image.FromStream(ms);

                MasterImage.Save(HttpContext.Current.Server.MapPath("../../../App_Shared/Reports/Temp/MasterImage.Bmp"), ImageFormat.Bmp);


    //Split master image into multiple image according to height / 1000
                Int32 ImageHeight = 1000, ImageWidth = MasterImage.Width, MasterImageHeight = MasterImage.Height;
                int PageCount = 0;
                Int32 TotalPages = MasterImage.Height / 1000;
                Bitmap[] imgs = new Bitmap[TotalPages];

                for (int y = 0; y + 1000 < MasterImageHeight; y += 1000, PageCount++)
                {
                    imgs[PageCount] = new Bitmap(ImageWidth, ImageHeight, PixelFormat.Format32bppPArgb);

                    using (Graphics gr = Graphics.FromImage(imgs[PageCount]))
                    {
                        gr.CompositingQuality = CompositingQuality.HighQuality;
                        gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        gr.SmoothingMode = SmoothingMode.HighQuality;
//First image now working with this code line
 gr.DrawImage(MasterImage, new System.Drawing.Rectangle(0, y, ImageWidth, ImageHeight),new System.Drawing.Rectangle(0, 0, ImageWidth, ImageHeight), GraphicsUnit.Pixel); //new System.Drawing.Rectangle(new Point(0, y), new Size(ImageWidth, ImageHeight)));
                        //gr.DrawImage(MasterImage, new System.Drawing.Rectangle(0, y, ImageWidth, ImageHeight)); //new System.Drawing.Rectangle(new Point(0, y), new Size(ImageWidth, ImageHeight)));

                        string FilePath = HttpContext.Current.Server.MapPath("../../../App_Shared/Reports/Temp/Image" + PageCount.ToString() + ".bmp");
                        imgs[PageCount].Save(FilePath, System.Drawing.Imaging.ImageFormat.Bmp);
    //Here it is saving images. I got first image with very poor quality but remaining in total balck color.
                        gr.Dispose();
                    }
                }

                return imgs;
            }

My First Image and all the other image are black

1 个答案:

答案 0 :(得分:2)

正如@HansPassant所提到的那样,源矩阵和目标矩形是相反的。

您还可以稍微改变分割的结构,以便它可以更灵活地工作,并且以后可能具有更好的可读性。

class Program
{
    static IList<Bitmap> SplitImage(Bitmap sourceBitmap, int splitHeight)
    {
        Size dimension = sourceBitmap.Size;
        Rectangle sourceRectangle = new Rectangle(0, 0, dimension.Width, splitHeight);
        Rectangle targetRectangle = new Rectangle(0, 0, dimension.Width, splitHeight);

        IList<Bitmap> results = new List<Bitmap>();

        while (sourceRectangle.Top < dimension.Height)
        {
            Bitmap pageBitmap = new Bitmap(targetRectangle.Size.Width, sourceRectangle.Bottom < dimension.Height ?
                targetRectangle.Size.Height
                :
                dimension.Height - sourceRectangle.Top, PixelFormat.Format32bppArgb);

            using (Graphics g = Graphics.FromImage(pageBitmap))
            {
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
                g.DrawImage(sourceBitmap, targetRectangle, sourceRectangle, GraphicsUnit.Pixel);
            }
            sourceRectangle.Y += sourceRectangle.Height;
            results.Add(pageBitmap);
        }

        return results;
    }

    static void Main(string[] args)
    {
        string sourceFilename = Environment.CurrentDirectory + @"\testimage.jpg";
        Bitmap sourceBitmap = (Bitmap)Image.FromFile(sourceFilename);

        var images = SplitImage(sourceBitmap, 79);
        int len = images.Count;
        for (int x = len; --x >= 0; )
        {
            var bmp = images[x];
            string filename = "Images-" + x + ".bmp";
            bmp.Save(Environment.CurrentDirectory + @"\" + filename, ImageFormat.Bmp);
            images.RemoveAt(x);
            bmp.Dispose();
            Console.WriteLine("Saved " + filename);
        }
        Console.WriteLine("Done with the resizing");
    }
}

如果页面的末尾小于指定的位图高度,这也会动态调整最后一个图像的大小:)