2011-10-24 13 views
0

GDI +を使用した画像の回転に取り組んでいます。画像メタデータごとに、8種類のオリエンテーションが必要です(http://www.impulseadventure.com/photo/exif-orientation.html)。しかし、すべての画像が水平または垂直のいずれの向きであっても、同じ向きになっています。誰かが問題がどこにあるのか、何か不足していると思いますか?GDI +を使用した画像の回転

ありがとうございます!

+0

FYI GDI +とASP.NET [必ずしもうまく再生できません](http://msdn.microsoft.com/en-us/library/system.drawing.aspx):システム内の 'クラス。描画名前空間は、WindowsまたはASP.NETサービス内では使用できません。これらのアプリケーションタイプのいずれかからこれらのクラスを使用しようとすると、サービスパフォーマンスの低下や実行時例外のような予期しない問題が発生する可能性があります。サポートされている代替方法については、「Windows Imaging Components」を参照してください。 –

+0

Windows Imaging Componentsはサポートされていません。また、System.Drawingが適切に使用するのが非常に難しく、正しく使用されないと、メモリとハンドルリークが発生するため、System.Drawingがサポートされていないことを100%確信しています。しかし、それを適切かつ安全に使用することは可能です。 –

+0

[説明] Windows Imaging Componentsは、Windows Server 2008以降のリリース2およびWindows 7でのみサポートされています。以前のバージョンでは、GDI +と同じ問題が発生しました。 WPFはサポートされていません。彼らはまだそれで新しいメモリリークを発見している。すべてのルールに従い、すべてのバグを知っている場合、GDI +とWIC(これら2つのプラットフォーム上)は、Webサービスで安全に使用できます。 [imageresizing.net](http://imageresizing.net)ライブラリでは、いずれかを使用できます。 –

答えて

0

私は数日前に、自動回転プラグインとしてthe imageresizing.net libraryに自動ローテーションを追加しました。関連するソースコードが含まれています。うまくいけば助けになるはずです。 FYIとして

if (!"true".Equals(settings["autorotate"], StringComparison.OrdinalIgnoreCase)) return RequestedAction.None; 

int propertyId = 0x0112; 
PropertyItem pi; 
try { 
    pi = b.GetPropertyItem(propertyId); 
} catch (ArgumentException) { 
    return RequestedAction.None; 
} 
if (pi == null) return RequestedAction.None; 

int total = 0; 

foreach (byte by in pi.Value) total += by; //Does not handle values larger than 255, but it doesn't need to, and is endian-agnostic. 

if (total == 8) b.RotateFlip(RotateFlipType.Rotate270FlipNone); 
if (total == 3) b.RotateFlip(RotateFlipType.Rotate180FlipNone); 
if (total == 6) b.RotateFlip(RotateFlipType.Rotate90FlipNone); 

if (total == 2) b.RotateFlip(RotateFlipType.RotateNoneFlipX); 
if (total == 4) b.RotateFlip(RotateFlipType.Rotate180FlipX); 
if (total == 5) b.RotateFlip(RotateFlipType.Rotate270FlipY); 
if (total == 7) b.RotateFlip(RotateFlipType.Rotate90FlipY); 

b.RemovePropertyItem(propertyId); 

、あなたは安全にそれを行う、またはその代わりにImageResizing.Net libraryを使用する方法についてASP.NET、you should read this articleにリサイズ画像を行っている場合。

1

私はCPUサイクルのコストArgumentExceptionが、テストのためではないでしょうただ、小さな改善、

var orientation_index = Array.IndexOf(b.PropertyIdList, propertyId); 

     if (orientation_index <0) return RequestedAction.None; 
     byte total =0; 
     foreach (byte b in b.GetPropertyItem(OrientationId).Value) 
     { 
      total += b; 
     } 
関連する問題