2011-01-26 43 views
4

iTextSharp.text.Image型のオブジェクトをSystem.Drawing.Imageに変換しようとしています。私は、私はこのすべて間違っについては行くことができiTextSharp.text.ImageをSystem.Drawing.Imageに変換する

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

が、私は、私は専門家に相談しない限り知っている、と無益の2時間後にオンラインで検索しません。ここで が動作していないコードの塊です最終的に私自身を質問として投稿しています。

答えて

1

私はかなり時々動作するでしょうが、一般的なケースでは失敗します...画像が使用している圧縮フィルタによって異なります。

私はJPEG画像ストリームが.jpegファイルで見られるものと確信しています...しかし、ほとんどの(すべて?)他の圧縮タイプでは、画像情報(高さ、幅、コンポーネントあたりのビット数、コンポーネント数、など)が不可欠です。

だから、それは可能ですが、それほど好きではありません。

PS:iTextが解凍できない画像フォーマットが少なくとも1つあります.CITTFAXDecode(おそらく他のJBIG2)です。そのような場合は、未処理のピクセルデータを取得してDrawing.Imageにラップすることができるその他のソフトウェアが必要になります。後述するように

1

はい、私はITextSharpとGetImageMethod()の書き換えBarcodeQRCodeクラスによって解決策を見つけた:

  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(); 

:その後

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); 


    } 

    } 
} 

、Iは、メソッドを呼び出すために、このコードを使用しました新しいGetImageメソッドでは、bmpクラスの処理方法を選択できます。この場合、JPEG画像ファイルを保存しますが、このメソッドは呼び出し元が使用するメモリストリームを返すことができます。

関連する問題