Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用ITEXTC检测图像对象#_C#_Winforms_Itext - Fatal编程技术网

C# 无法使用ITEXTC检测图像对象#

C# 无法使用ITEXTC检测图像对象#,c#,winforms,itext,C#,Winforms,Itext,我想更改pdf中现有图像的亮度我的代码如下。当我调试此代码时,只为表单对象运行循环,而不转到xobject字典。在RUP中,它显示在/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R中 public MemoryStream PDFimgChnages(Stream fileStream) { BinaryReader br = new BinaryReader(fileStream); byte[] byt

我想更改pdf中现有图像的亮度我的代码如下。当我调试此代码时,只为表单对象运行循环,而不转到xobject字典。在RUP中,它显示在/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R中

public MemoryStream PDFimgChnages(Stream fileStream)
    {
        BinaryReader br = new BinaryReader(fileStream);
        byte[] byt = br.ReadBytes((int)fileStream.Length);
        MemoryStream ms = new MemoryStream();

        using (PdfReader pdf = new PdfReader(byt))
        {
            if (pdf.IsOpenedWithFullPermissions)
            {

                using (PdfStamper stp = new PdfStamper(pdf, ms))
                {
                    PdfWriter writer = stp.Writer;
                    //
                    int page_count = pdf.NumberOfPages;
                    for (int i = 1; i <= page_count; i++)
                    {
                        PdfDictionary pg = pdf.GetPageN(i);
                        PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
                        PdfDictionary xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
                        if (xobj != null)
                        {
                            foreach (PdfName name in xobj.Keys)
                            {
                                PdfObject obj = xobj.Get(name);
                                if (obj.IsIndirect())
                                {
                                    PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(obj);
                                    PdfName type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
                                    if (PdfName.IMAGE.Equals(type))
                                    {
                                        int xrefIdx = ((PRIndirectReference)obj).Number;
                                        PdfObject pdfObj = pdf.GetPdfObject(xrefIdx);
                                        PdfStream str = (PdfStream)(pdfObj);
                                        byte[] bytes = PdfReader.GetStreamBytesRaw((PRStream)str);
                                        iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance((PRIndirectReference)obj);

                                        string filter = tg.Get(PdfName.FILTER).ToString();

                                        if (filter == "/DCTDecode")
                                        {
                                            System.Drawing.Image img2 = System.Drawing.Image.FromStream(new MemoryStream(bytes));

                                            if (img2.Height == 200 && img2.Width == 160)
                                            {
                                                System.Drawing.Bitmap originalImage = (Bitmap)img2;
                                                System.Drawing.Bitmap adjustedImage = (Bitmap)img2;
                                                float brightness = 1.0f; // no change in brightness
                                                float contrast = 2.0f; // twice the contrast
                                                float gamma = 1.0f; // no change in gamma

                                                float adjustedBrightness = brightness - 1.0f;
                                                // create matrix that will brighten and contrast the image
                                                float[][] ptsArray ={
                                        new float[] {contrast, 0, 0, 0, 0}, // scale red
                                        new float[] {0, contrast, 0, 0, 0}, // scale green
                                        new float[] {0, 0, contrast, 0, 0}, // scale blue
                                        new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha
                                        new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}};

                                                ImageAttributes imageAttributes = new ImageAttributes();
                                                imageAttributes.ClearColorMatrix();
                                                imageAttributes.SetColorMatrix(new ColorMatrix(ptsArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
                                                imageAttributes.SetGamma(gamma, ColorAdjustType.Bitmap);
                                                System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(adjustedImage);
                                                g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, adjustedImage.Width, adjustedImage.Height), 0, 0, originalImage.Width, originalImage.Height, GraphicsUnit.Pixel, imageAttributes);
                                            }
                                            //img2 = Resize(img2);
                                            var stream = new System.IO.MemoryStream();
                                            img2.Save(stream, ImageFormat.Jpeg);
                                            stream.Position = 0;
                                            img = iTextSharp.text.Image.GetInstance(stream);
                                            PdfReader.KillIndirect(obj);
                                            writer.AddDirectImageSimple(img, (PRIndirectReference)obj);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    stp.FormFlattening = true;
                }
                return ms;
            }
            else
                return null;
        }
    }

在rups中,它显示在/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R中,但您的代码只在“/RESOURCES/XObject”中立即查找图像,因此它显然找不到您的Im26。因此,只需重新编写代码就可以更深入地钻研该级别。我还使用此代码查找im26,但循环只运行一次。如果你知道这个问题,那么请帮助@mkl这个问题正是你在说“it show in/RESOURCES/XObject/RESOURCES/XObject/Im26:14 0 R”时提到的,在你的例子中,图像是表单XObject的直接资源,而表单XObject又是页面的资源。另一方面,您链接和显示的代码只查找作为即时页面资源的图像。如果希望示例代码正确处理,请共享示例PDF。如果希望示例代码正确处理,请共享示例PDF。
byte[] bytes = System.IO.File.ReadAllBytes(final);
            Stream stream = new MemoryStream(bytes);
            pdfImageModification objPIM = new pdfImageModification();
            MemoryStream ms = objPIM.PDFimgChnages(stream);
            FileStream file = new FileStream(final1, FileMode.Create, FileAccess.Write);
            ms.WriteTo(file);