- PR -

VB.NET:テキストファイルをTIFFファイルに印刷

投稿者投稿内容
ハイジ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2004-02-28 14:05
いつもお世話になっております。

指定したテキストファイルの内容をTIFFファイルに印刷する方法を探しているのですが、
なかなか見つかりません。
どなたかご存知の方がいらっしゃいましたら、ぜひ教えていただけないでしょうか?

環境はVB.NET2003を使用しております。
おさるさん
常連さん
会議室デビュー日: 2004/01/05
投稿数: 24
投稿日時: 2004-02-28 16:13
引用:

ハイジさんの書き込み (2004-02-28 14:05) より:
指定したテキストファイルの内容をTIFFファイルに印刷する方法を探しているのですが、
なかなか見つかりません。




やはりツールを使うしかないのでは?
http://www.antenna.co.jp/RTC/rtc2004/2004new.htm
こんな感じですかね
ハイジ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2004-02-29 16:09
お礼が遅くなってしまってすみません!
おさるさん、お返事ありがとうございました。
しかし、ツールに頼ってはいけないみたいなので、
他の方法を探したところ、printerオブジェクトを使ってやってみることにしました。

お手数おかけしてしまって申し訳ありませんでした。
またよろしくお願い致します。
ハイジ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2004-03-01 10:49
何度も申し訳ないです・・・。
上のスレッドで、「printerオブジェクトを使ってやってみる」と言ったのですが、
なかなかうまくいかず・・・。
そこで、一旦テキストファイルをTIFFファイルに画像として保存しようとしたのですが、
その際、TIFFファイルをG3圧縮形式にして保存したいのです。
ですが、どうもうまくいきません。

ソース↓-------------------------------------------------------------
Dim bmp As Bitmap = New Bitmap(テキストファイル名)
Dim eps As New Imaging.EncoderParameters()
Dim myImageCodecInfo As Imaging.ImageCodecInfo

eps.Param(0) = New EncoderParameter(Imaging.Encoder.Compression, encoderValue.CompressionCCITT3)
myImageCodecInfo = GetEncoderInfo("image/tiff")

Dim ext As String = myImageCodecInfo.FilenameExtension.Split(";"c)(0)
ext = Path.GetExtension(ext).ToLower()
SaveImage = Path.ChangeExtension(FileName, ext)

bmp.Save(SaveImage, myImageCodecInfo, eps) 
  ↑ここで、「GDI+ で一般的なエラーが発生しました」というエラー発生!

bmp.Dispose()
ここまで↑-----------------------------------------------------------

いろいろ調査をしてみても、「EncoderParametersオブジェクトを使って
画像をsaveしようとすると例外的なエラーが発生することが多い」という記述はあるのですが、
「原因はわからない」という風になってしまっていて・・・。

どなたかご存知の方がいらっしゃいましたら、しつこい質問で申し訳ないのですが
教えていただけないでしょうか??
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-03-01 13:40
この辺り参考にならないでしょうか。
http://www.gotdotnet.com/Community/MessageBoard/Thread.aspx?id=174041

ポイントは、
・BitmapのピクセルフォーマットをPixelFormat.Format1bppIndexedにしなければならない
・PixelFormat.Format1bppIndexedのBitmapからは
 Graphics.FromImageできないので、自力でピクセルデータをセットしなければならない
ハイジ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2004-03-02 09:00
ナキヲさん、どうもありがとうございました!!
さっそく教えていただいたページを参考にやってみたら、
G3圧縮形式のTIFFファイルができました!!
が、その内容が真っ黒になっていて画像が見れないのです・・・。

あのビットのシフト部分が怪しいと思うのですが、私の勉強不足でまだ理解できず・・・。
申し訳ないです!
もう少し勉強してみます!
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-03-02 09:50
こんなかんじでいけました。(C#)
私も最初真っ黒に。。
g.Clear(Color.White);
でいけるようになったような気がします。

コード:
		private unsafe void SetIndexedPixel(int x,int y, BitmapData bmd, bool pixel) 
		{ 
			byte* p = (byte*)bmd.Scan0.ToPointer(); 
			int index = y * bmd.Stride + (x >> 3); 
			byte mask = (byte)(0x80 >> (x & 0x7)); 

			if (pixel) 
				p[index]|=mask; 
			else 
				p[index]&=(byte)(mask^0xff); 
		} 

		private Bitmap Get1bppIndexedImage(Bitmap bmp)
		{
			Bitmap monoBmp = new Bitmap(bmp.Width, bmp.Height, PixelFormat.Format1bppIndexed);
			BitmapData data = monoBmp.LockBits(
				new Rectangle(0, 0, monoBmp.Width, monoBmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
			for(int x = 0; x < bmp.Width; x++)
			{
				for(int y = 0; y < bmp.Height; y++)
				{
					if(bmp.GetPixel(x, y).GetBrightness()>0.5)
						SetIndexedPixel(x, y, data, true);
					else
						SetIndexedPixel(x, y, data, false);
				}
			}
			monoBmp.UnlockBits(data);
			return monoBmp;
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			Bitmap bmp = new Bitmap(256, 256);
			Graphics g = Graphics.FromImage(bmp);

			g.SmoothingMode = SmoothingMode.None;
			g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
			g.Clear(Color.White);
			g.DrawLine(new Pen(Color.Black), 0, 0, 256, 256);
			g.DrawString("テスト文字列", new Font("MS ゴシック", 32), new SolidBrush(Color.Black), new PointF(0F, 0F));
			g.Dispose();

			Bitmap monoBmp = Get1bppIndexedImage(bmp);
			monoBmp.SetResolution(200, 200);

			ImageCodecInfo imageCodecInfo;
			imageCodecInfo = GetEncoderInfo(ImageFormat.Tiff);

			EncoderParameters encoderParameters = new EncoderParameters(2);
			encoderParameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 1L);
			encoderParameters.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4);

			monoBmp.Save(@"c:\test.tif", imageCodecInfo, encoderParameters);
		}

ハイジ
会議室デビュー日: 2003/11/28
投稿数: 19
投稿日時: 2004-03-02 10:42
ナキヲさん、お返事ありがとうございます!!
だいたいはVBに変換することができたのですが、1つ分からない部分だけ
質問させていただきたいのですが・・・。

ソース↓----------------------------------------------------------
If (pixel) Then
p(index)|=mask
Else
p(index) &= CType((mask ^ &HFF), Byte)
End If
ここまで↑--------------------------------------------------------

この、「p(index)」の部分は一体何なのでしょうか??
ここの部分がいまいち理解できず、VBに変換することができません。
本当に申し訳ないのですが、できればここの処理の意味を教えていただけないでしょうか?

スキルアップ/キャリアアップ(JOB@IT)