Преобразование iTextSharp.text.Image обратно в System.Drawing.Image - PullRequest
4 голосов
/ 26 января 2011

Я пытаюсь преобразовать объект типа iTextSharp.text.Image обратно в System.Drawing.Image. Вот кусок кода, который не работает:

System.Drawing.Image img = System.Drawing.Image.FromStream(new MemoryStream(itextImg.RawData));

Возможно, я все об этом ошибаюсь, но я не узнаю, если не проконсультируюсь с экспертами, и после двух часов бесполезного поиска в Интернете я наконец-то отправлю это себе как вопрос.

Ответы [ 2 ]

1 голос
/ 24 июля 2013

Да, я нашел решение, переписав класс BarcodeQRCode в ITextSharp и GetImageMethod (), как описано ниже:

using System;
using System.Collections.Generic;
using System.Drawing;
using iTextSharp.text;
using iTextSharp.text.pdf.qrcode;
using iTextSharp.text.pdf.codec;
/*
   Class rewritted to Convert ByteMatrix to BMP image by rewritting GetImage method
from ITextSharp 
author: Luis Claudio Souza
*/

namespace iTextSharp.text.pdf{

/**
 * A QRCode implementation based on the zxing code.
 * @author Paulo Soares
 * @since 5.0.2
 */
public class BarcodeQRCode {
    ByteMatrix bm;

    /**
     * Creates the QR barcode. The barcode is always created with the smallest possible     size and is then stretched
     * to the width and height given. Set the width and height to 1 to get an unscaled barcode.
     * @param content the text to be encoded
     * @param width the barcode width
     * @param height the barcode height
     * @param hints modifiers to change the way the barcode is create. They can be EncodeHintType.ERROR_CORRECTION
     * and EncodeHintType.CHARACTER_SET. For EncodeHintType.ERROR_CORRECTION the values can be ErrorCorrectionLevel.L, M, Q, H.
     * For EncodeHintType.CHARACTER_SET the values are strings and can be Cp437, Shift_JIS and ISO-8859-1 to ISO-8859-16. The default value is
     * ISO-8859-1.
     * @throws WriterException
     */
    public BarcodeQRCode(String content, int width, int height, IDictionary<EncodeHintType, Object> hints) {
        QRCodeWriter qc = new QRCodeWriter();
        bm = qc.Encode(content, width, height, hints);
    }

    private byte[] GetBitMatrix() {
        int width = bm.GetWidth();
        int height = bm.GetHeight();
        int stride = (width + 7) / 8;
        byte[] b = new byte[stride * height];
        sbyte[][] mt = bm.GetArray();
        for (int y = 0; y < height; ++y) {
            sbyte[] line = mt[y];
            for (int x = 0; x < width; ++x) {
                if (line[x] != 0) {
                    int offset = stride * y + x / 8;
                    b[offset] |= (byte)(0x80 >> (x % 8));
                }
            }
        }
        return b;
    }

    /** Gets an <CODE>Image</CODE> with the barcode.
     * @return the barcode <CODE>Image</CODE>
     * @throws BadElementException on error
     */

    public void GetImage()
    {

        sbyte[][] imgNew = bm.GetArray();
        Bitmap bmp1 = new Bitmap(bm.GetWidth(), bm.GetHeight());


        Graphics g1 = Graphics.FromImage(bmp1);
        g1.Clear(Color.White);
        for (int i = 0; i <= imgNew.Length - 1; i++)
        {
            for (int j = 0; j <= imgNew[i].Length - 1; j++)
            {
                if (imgNew[j][i] == 0)
                {
                    g1.FillRectangle(Brushes.Black, i, j, 1, 1);
                }
                else
                {
                    g1.FillRectangle(Brushes.White, i, j, 1, 1);
                }
            }
        }
        bmp1.Save("D:\\QREncode.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);


    }

    }
}

После этого я использовал этот код для вызова метода:

            var hints = new Dictionary<EncodeHintType, object>();
        hints.Add(EncodeHintType.ERROR_CORRECTION, iTextSharp.text.pdf.qrcode.ErrorCorrectionLevel.H);


        BarcodeQRCode code = new BarcodeQRCode("98134979213479523874952873", 100, 100, hints);

        code.GetImage();

В новом методе GetImage вы можете выбрать, что делать с классом bmp.В этом случае он сохраняет файл изображения JPEG, но метод может вернуть поток памяти, который будет использоваться вызывающей стороной.

1 голос
/ 03 февраля 2011

Я почти уверен, что это будет работать время от времени, но в общем случае не получится ... это зависит от того, какие фильтры сжатия использует изображение.

Я считаю, что потоки изображений JPEG - это именно то, что вы видите в файле .jpeg ... но для большинства (всех?) Других типов сжатия информация об изображении (высота, ширина, биты на компонент, числокомпонентов и т. д.) жизненно важно.

Так что это будет возможно, но не так.

PS: есть по крайней мере один формат изображения, который iText не может распаковать, CITTFAXDecode (JBIG2, вероятно,другие).В этих случаях вам понадобится другое ПО, которое будет выводить необработанные данные пикселей, чтобы вы могли обернуть его в Drawing.Image.

...