C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: PrintPage時のInterpolationModeの指


(過去ログ 139 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■81501 / inTopicNo.1)  PrintPage時のInterpolationModeの指
  
□投稿者/ ゆう (5回)-(2016/09/30(Fri) 13:13:21)

分類:[VB.NET/VB2005 以降] 

初めて質問します。
JPEGファイルを読みだしてプリンタに印刷するアプリケーションを作成していますが、画像補間のInterpolationModeの指定が有効にならないようなのです。
以下のようなコードで試しているのですが、なにか問題があるのでしょうか?

---
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap("C:\hoge\hoge.jpg")

'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'補間方法として高品質双三次補間を指定する
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor

' 縦向き
PrintDocument1.DefaultPageSettings.Landscape = Not _
PrintDocument1.DefaultPageSettings.Landscape

Dim mypicWidth As Integer
Dim mypicHeight As Integer

' イメージを縮小貼り付け
mypicWidth = 827
mypicHeight = 1169

e.Graphics.DrawImage(canvas, 0, 0, mypicWidth, mypicHeight)
canvas.Dispose()
End Sub
---

ここで、mypicWidthとmypicHeightはA4用紙の実測値をセットしています。
読み込んでいるhoge.jpgはスキャナから読み込んだ画像JPEGで、2154×3022ピクセルの画像です。
出力先は Microsoft XPS Document Writer で試しています。(紙の節約w)

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor の行を
有効にしても無効にしても印字結果に変化がないように見えます。

アドバイスいただけると助かります。
よろしくお願いいたします。


引用返信 編集キー/
■81502 / inTopicNo.2)  Re[1]: PrintPage時のInterpolationModeの指
□投稿者/ kiku (116回)-(2016/09/30(Fri) 14:05:08)

> '補間方法として高品質双三次補間を指定する
> g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor

上記の設定は、最近傍補間、ニアレストネイバー法に設定しており、
高品質双三次補間になっておりません。
InterpolationModeの設定値をいろいろ変えてみてはいかがでしょうか?

参考
http://dobon.net/vb/dotnet/graphics/interpolationmode.html
引用返信 編集キー/
■81503 / inTopicNo.3)  Re[2]: PrintPage時のInterpolationModeの指
□投稿者/ ゆう (6回)-(2016/09/30(Fri) 14:24:30)
kikuさま
早速の返信ありがとうございます。

> 上記の設定は、最近傍補間、ニアレストネイバー法に設定しており、
> 高品質双三次補間になっておりません。
> InterpolationModeの設定値をいろいろ変えてみてはいかがでしょうか?

すみません。。
コメントを直しておりませんでした。
ここに至るまでに HighQualityBicubicやNearestNeighborなどいろいろ試しておりました。
コメントと内容が合ってなく申し訳ありません。

ただいずれの設定値にしても、見た目に変化がないのです。
ちなみにプリンタ出力ではなく、フォームに表示するパターンも試しましたが、そちらは効果を確認できました。
以下のようなコードです。

---
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'画像ファイルを読み込んで、Imageオブジェクトとして取得する
Dim img As Image = Image.FromFile("C:\hoge\hoge.jpg")

'補間方法として高品質双三次補間を指定する
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic

'画像をcanvasの座標(20, 10)の位置に描画する
g.DrawImage(img, 20, 10, 827, 1169)

'Imageオブジェクトのリソースを解放する
img.Dispose()

'Graphicsオブジェクトのリソースを解放する
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
End Sub
---

これだと上手くいくのですが。。
よろしくお願いいたします。


引用返信 編集キー/
■81504 / inTopicNo.4)  Re[1]: PrintPage時のInterpolationModeの指
□投稿者/ 魔界の仮面弁士 (918回)-(2016/09/30(Fri) 14:25:38)
No81501 (ゆう さん) に返信
> '描画先とするImageオブジェクトを作成する
> Dim canvas As New Bitmap("C:\hoge\hoge.jpg")
「描画元」では無いでしょうか。
「描画先」はプリンター(e.Graphics)だと思います。


> 'ImageオブジェクトのGraphicsオブジェクトを作成する
> Dim g As Graphics = Graphics.FromImage(canvas)
作成した Graphcs を Dispose し忘れていますよ。
(canvas は Dispose されていますが)

また、この Graphics は作成された後、
描画処理には全く使われていないように見えます。



> '補間方法として高品質双三次補間を指定する
> g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
> e.Graphics.DrawImage(canvas, 0, 0, mypicWidth, mypicHeight)

.InterpolationMode を指定するべきは e.Graphics の方ですよ。
e.Graphics の .DrawImage で描画するのですから。
引用返信 編集キー/
■81505 / inTopicNo.5)  Re[3]: PrintPage時のInterpolationModeの指
□投稿者/ 魔界の仮面弁士 (919回)-(2016/09/30(Fri) 14:33:02)
No81503 (ゆう さん) に返信
> '描画先とするImageオブジェクトを作成する
> Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
この場合は「描画先」で合っていますね。


> '画像ファイルを読み込んで、Imageオブジェクトとして取得する
> Dim img As Image = Image.FromFile("C:\hoge\hoge.jpg")
No81501 のコードでは、この画像を「描画先とするImage」とされていました。


> 'ImageオブジェクトのGraphicsオブジェクトを作成する
> Dim g As Graphics = Graphics.FromImage(canvas)
>
> '補間方法として高品質双三次補間を指定する
> g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
>
> '画像をcanvasの座標(20, 10)の位置に描画する
> g.DrawImage(img, 20, 10, 827, 1169)

g.DrawImage で描画するのですから、
g.InterpolationMode で設定するのが妥当ですね。


しかし No81501 のコードでは、
e.Graphics.DrawImage で描画しようとしているのに、
g.InterpolationMode で設定されています。本来は
e.Graphics.InterpolationMode に設定するべきです。


> 'Graphicsオブジェクトのリソースを解放する
> g.Dispose()
No81501 のコードでは、この部分が漏れていました。
もっとも、そもそもアチラは g を作る必要が無いのですが。
引用返信 編集キー/
■81506 / inTopicNo.6)  Re[4]: PrintPage時のInterpolationModeの指
□投稿者/ ?? (1回)-(2016/09/30(Fri) 15:58:52)
魔界の仮面弁士さん、こんにちは
丁寧なご指摘ありがとうございます。

何に対してInterpolationMode を行うのか。。が理解できていないようでした。
いただいたご指摘をもとに見直してみます。

またご報告します。
ありがとうございました。



引用返信 編集キー/
■81507 / inTopicNo.7)  Re[5]: PrintPage時のInterpolationModeの指
□投稿者/ ゆう (7回)-(2016/09/30(Fri) 16:46:17)
お世話になります。
下記のようなコードで試してみました。
が、やはり同じ結果でした。

---
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

'描画元とするimgオブジェクトを作成する
Dim mypic As Image = Image.FromFile("C:\hoge\hoge.jpg")
Dim mypicWidth As Integer
Dim mypicHeight As Integer

' 縦向き
PrintDocument1.DefaultPageSettings.Landscape = Not PrintDocument1.DefaultPageSettings.Landscape

'補間方法として高品質双三次補間を指定する
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic

' イメージを縮小貼り付け
mypicWidth = 827
mypicHeight = 1169

e.Graphics.DrawImage(mypic, 0, 0, mypicWidth, mypicHeight)
mypic.Dispose()

End Sub
---

出力先のプリンタに依存するのでしょうか。。?
アドバイスいただければ助かります。
よろしくお願いいたします。



引用返信 編集キー/
■81508 / inTopicNo.8)  Re[6]: PrintPage時のInterpolationModeの指
□投稿者/ 魔界の仮面弁士 (920回)-(2016/09/30(Fri) 17:58:26)
No81507 (ゆう さん) に返信
> アドバイスいただければ助かります。

一緒に CompositingQuality も指定してみるとか。
引用返信 編集キー/
■81515 / inTopicNo.9)  Re[7]: PrintPage時のInterpolationModeの指
□投稿者/ ?? (2回)-(2016/10/03(Mon) 08:59:16)
No81508 (魔界の仮面弁士 さん) に返信

お世話になります。
週末アクセスできませんでしたので遅くなりました。

> 一緒に CompositingQuality も指定してみるとか。
こちらも試してみましたが効果ありませんでした。
色々考えた末、ファイルに対しては指定がきくようなので、いったん別ファイルに書き出して
それを印刷する形式にしようと考えています。

---
Private Sub But_Bitmap_Click(sender As Object, e As EventArgs) Handles But_Bitmap.Click

Dim bmp1 As Bitmap = New Bitmap("C:\hoge\hoge.jpg")
Dim bmp2 As Bitmap = New Bitmap(827, 1169)

Dim g As Graphics = Graphics.FromImage(bmp2)
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(bmp1, 0, 0, bmp2.Width, bmp2.Height)

bmp2.Save("C:\hoge\hoge_BMP.bmp")
End Sub
---

上記でhoge_BMP.bmpにHighQualityBicubic処理後のファイルが出力されることを確認しました。
これを印刷しようと考えています。

丁寧にアドバイスいただきどうもありがとうございました。




引用返信 編集キー/
■81516 / inTopicNo.10)  Re[8]: PrintPage時のInterpolationModeの指
□投稿者/ 魔界の仮面弁士 (921回)-(2016/10/03(Mon) 09:10:02)
No81515 (?? さん) に返信
>>一緒に CompositingQuality も指定してみるとか。
> こちらも試してみましたが効果ありませんでした。

当方では違いが生じたのですけれどね。何が違うのかな…。


> Dim bmp1 As Bitmap = New Bitmap("C:\hoge\hoge.jpg")
> Dim bmp2 As Bitmap = New Bitmap(827, 1169)
> Dim g As Graphics = Graphics.FromImage(bmp2)

3 つとも Using しましょう。(もしくは Dispose)
引用返信 編集キー/
■81519 / inTopicNo.11)  Re[9]: PrintPage時のInterpolationModeの指
□投稿者/ ゆう (8回)-(2016/10/03(Mon) 11:29:41)
2016/10/03(Mon) 11:30:51 編集(投稿者)

No81516 (魔界の仮面弁士 さん) に返信

お世話になります。

>>こちらも試してみましたが効果ありませんでした。
>
> 当方では違いが生じたのですけれどね。何が違うのかな…。

 そうなんですね。。もう少し調べてみます。
 他のマシンで試してみるとか。


>>Dim bmp1 As Bitmap = New Bitmap("C:\hoge\hoge.jpg")
>>Dim bmp2 As Bitmap = New Bitmap(827, 1169)
>>Dim g As Graphics = Graphics.FromImage(bmp2)
>
> 3 つとも Using しましょう。(もしくは Dispose)

 いつもアドバイスありがとうございます。
 確実に行いたいと思います。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -