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

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

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

Re[6]: Tiff画像の解像度設定


(過去ログ 128 を表示中)

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

■75973 / inTopicNo.1)  Tiff画像の解像度設定
  
□投稿者/ 三十路PG (1回)-(2015/05/20(Wed) 23:43:25)

分類:[C#] 

お世話になります。

■環境
VisualStudio2012 C# 
Windows7 64bit

Tiff画像を取り込み保存をする処理を作っています。
Tiff画像自体は1枚の画像を使っているのですが、
出力後のファイルをTiff解析サイト・解析ツールで見たときに
解像度が 96000 / 1000 = 96.000 と解析されてしまいます。
※取り込む前の解像度では96 / 1 = 96 でした

実際にそうなった処理は以下です。

Bitmap bmpNew = new Bitmap(@" C:\TEST\TSTTMP.tif");
bmpNew.Save(@"C:\OUTPUT\TSTTMP.tif");
bmpNew.Dispose();

 BitmapではなくImage、保存形式をSystem.Drawing.Imaging.ImageFormat.Tifで指定。
 CompressionCCITT4等の指定を試しましたが同様でした。
 propertyitemのPropertyTagXResolutionを変更してみましたが、 
 デバック上では変更されているものの出力後には反映されませんでした。
 setresolutionでの指定も行ってみましたが、変化がありませんでした。


このようになるのは取り込み方か保存時に誤りがあるのでしょうか。
また、出力ファイルの解像度を 96 / 1 = 96 とする方法はあるでしょうか。

引用返信 編集キー/
■75974 / inTopicNo.2)  Re[1]: Tiff画像の解像度設定
□投稿者/ shu (743回)-(2015/05/21(Thu) 07:55:14)
No75973 (三十路PG さん) に返信

> 解像度が 96000 / 1000 = 96.000 と解析されてしまいます。
> ※取り込む前の解像度では96 / 1 = 96 でした
この2つは同じですよね?

96000   96
----- = --   これは約分といいます。
 1000    1

引用返信 編集キー/
■75975 / inTopicNo.3)  Re[2]: Tiff画像の解像度設定
□投稿者/ 三十路PG (3回)-(2015/05/21(Thu) 08:28:11)
No75974 (shu さん) に返信
> ■No75973 (三十路PG さん) に返信
>
>>解像度が 96000 / 1000 = 96.000 と解析されてしまいます。
>>※取り込む前の解像度では96 / 1 = 96 でした
> この2つは同じですよね?
>
> 96000 96
> ----- = -- これは約分といいます。
> 1000 1

返信ありがとうございます。

結果として同じ96/1になるのは理解していますが、
解析結果の表示が異なっているため、何らかの情報が出力前後で異なると考えています。
その異なる原因と出力後の解析も96/1にする方法があるのか…といった質問になります。
引用返信 編集キー/
■75976 / inTopicNo.4)  Re[3]: Tiff画像の解像度設定
□投稿者/ Hongliang (310回)-(2015/05/21(Thu) 08:53:29)
> 解析結果の表示が異なっているため、何らかの情報が出力前後で異なると考えています。
> その異なる原因と出力後の解析も96/1にする方法があるのか…といった質問になります。

元のファイル→GDI+によってデコード→GDI+によってエンコード
という手順を経る以上、当然一部データは変更されます。
TIFFなどでは解像度は32bit整数値の分数で表現しますが、GDI+では単精度浮動小数点数で表現します。デコードした時点で分子分母の情報は失われているわけです。
エンコード時に分子を1000にするのはGDI+のエンコーダの癖みたいなものです。
System.Drawing.Imaging.EncoderにResolutionみたいな要素がない以上、この動作を変更するのは無理でしょう。
どうしても我慢ならないのなら、エンコード後のバイナリを直接書き換えるぐらいしか。
引用返信 編集キー/
■75977 / inTopicNo.5)  Re[3]: Tiff画像の解像度設定
□投稿者/ shu (744回)-(2015/05/21(Thu) 08:57:28)
No75975 (三十路PG さん) に返信

解像度は96DPIなのですよね?プログラムで設定している値も
解析ツールの結果も同じではないですか?


96000/1000 の分母、分子の単位は何でしょう?
96/1 の分母、分子の単位は何でしょう?
解析ツールの途中計算を気にする意味は何でしょう?

引用返信 編集キー/
■75982 / inTopicNo.6)  Re[4]: Tiff画像の解像度設定
□投稿者/ 魔界の仮面弁士 (342回)-(2015/05/21(Thu) 11:11:03)
No75976 (Hongliang さん) に返信
>>解析結果の表示が異なっているため、何らかの情報が出力前後で異なると考えています。
>>その異なる原因と出力後の解析も96/1にする方法があるのか…といった質問になります。
> 元のファイル→GDI+によってデコード→GDI+によってエンコード
> という手順を経る以上、当然一部データは変更されます。

ビッグエンディアン形式(ファイル先頭が4D,4D,00,2A)の TIFF を読み取ってみましたが、
No75973 の方法で再保存すると、リトルエンディアン形式(49,49,2A,00) になるようですね。

また、IFDポインタを確認してみたところ、読込元のファイルでは
ファイル先頭(画素データの前)にあった IFD が、
ファイル末尾(画素データの後)に移動されてしまう現象も確認できました。


>> propertyitemのPropertyTagXResolutionを変更してみましたが、 
> TIFFなどでは解像度は32bit整数値の分数で表現しますが、
ResolutionUnit は、コード3(Int16)で、
X/YResolution は、コード5(Int32分子,Int32分母)ですね。

今回使われる タグId となる、
 0x011A 水平方向解像度(分数) [PropertyTagXResolution] 既定値:なし
 0x011B 垂直方向解像度(分数) [PropertyTagYResolution] 既定値:なし
 0x0128 解像度単位 [PropertyTagResolutionUnit] 既定値:inch(=2)
はいずれも必須タグですが、実際にはこれらを含まない画像もたびたび目にします。

PropertyItem は、タグの「取得」「変更」には利用できても
タグの「追加」は行えないので、GDI+ からの調整は無理そうです。
(SetResolution で指定できるわけでもないようで…)
引用返信 編集キー/
■75993 / inTopicNo.7)  Re[5]: Tiff画像の解像度設定
□投稿者/ 三十路PG (4回)-(2015/05/21(Thu) 21:20:02)
返信ありがとうございます。
返信を読ませて頂き、バイナリで取得してからバイナリを書き換え、保存をすることで解像度を96/1等に変更することができました。


No75976 (Hongliang さん) に返信

GDI+での影響だったのですね。。。
また、バイナリでの書き換え案を教えていただきありがとうございます。
System.Drawing等でできるのかできないのかがはっきり分からなかったため、助かりました。

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

動作・バイナリ内まで確認していただきありがとうございます。
記事を書いた時点ではTIFF構造が余り分かっていなかったのですが、
調べた後で返信を見て納得致しました。

No75977 (shu さん) に返信

気持ちは分かります、私も最初そのように思いました。
ですが書き換わっている以上、
その原因と修正するには、といったモノがないとソースが悪いのか仕様なのか等が分けられません。
私の中で試行錯誤した結果わからなかったのでこの場をお借りました。

解決済み
引用返信 編集キー/
■75995 / inTopicNo.8)  Re[6]: Tiff画像の解像度設定
□投稿者/ shu (745回)-(2015/05/22(Fri) 07:54:49)
No75993 (三十路PG さん) に返信
> ■No75977 (shu さん) に返信
>
> 気持ちは分かります、私も最初そのように思いました。
> ですが書き換わっている以上、
> その原因と修正するには、といったモノがないとソースが悪いのか仕様なのか等が分けられません。
> 私の中で試行錯誤した結果わからなかったのでこの場をお借りました。
>

96DPIということには変わりないのにどこが問題なのかということです。
書き換わっているのは保存しなおしているので不思議なことではないですよね。
他で作成したものとBitmap.Saveで保存したものとの相違によりどんな影響がでるのでしょうか?
影響がないのならわざわざ複雑な書き込みを行う必要はないと思います。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -