- 題名: JPEG画像をロスレス回転する。
- 日時: 2004/03/29 19:11:10
- ID: 3371
- この記事の返信元:
- (なし)
- この記事への返信:
- [3385] Re[1]: JPEG画像をロスレス回転する。2004/03/30 13:19:28
- ツリーを表示
2004/03/30(Tue) 15:00:02 編集(投稿者)
■No3371に返信(アフロさんの記事)
まるまる移植しました。動作確認はしておりません。
一部そのままではキャストできない部分がありましたが、
たぶん大丈夫かと思います。
ただ、どぼんさんのTipsページにC#とVB.NETのサンプルはたくさんありますので、
今後はご自分で移植する努力をしたほうがいいと思います。
.NET Framework上ではC++よりもC#の方がサンプルが多いので。
#とかいいつつ、自分はまだC#やったことないけど(^^;
今Tips見てたら、そのものズバリがあるではないですか!!
C#のコードをVB.NETへ変換する
http://dobon.net/vb/dotnet/links/convertcs2vb.html
というわけで、まぁ〜自力で移植しちゃったのでそのままにしますが、
今度からは参照して勉強してください。
-----
Imports System.Drawing.Imaging
Public Class Class1
Private Shared Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
Dim j As Integer
Dim encoders As ImageCodecInfo()
encoders = ImageCodecInfo.GetImageEncoders
For j = 0 To encoders.Length
If (encoders(j).MimeType = mimeType) Then
Return encoders(j)
Else
Return Nothing
End If
Next
End Function
Private Sub WriteNewDescriptionInImage(ByVal Filename As String, ByVal NewDescription As String)
Dim Pic As Image
Dim PropertyItems As PropertyItem()
Dim bDescription(NewDescription.Length) As Byte
Dim i As Integer
Dim FilenameTemp As String
Dim Enc As Encoder = Encoder.Transformation
Dim EncParms As EncoderParameters = New EncoderParameters(1)
Dim EncParm As EncoderParameter
Dim CodecInfo As ImageCodecInfo = GetEncoderInfo("image/jpeg")
'// copy description into byte array
For i = 0 To i < NewDescription.Length
'** Char型→Byte型へのキャストはVBではできない。Unicodeのため。
'** 文字列内の1文字をByte型にすると言うことは、Valだと思われ。
bDescription(i) = Val(NewDescription.Chars(i))
Next
'// load the image to change
Pic = Image.FromFile(Filename)
'// put the new description into the right property item
PropertyItems = Pic.PropertyItems
PropertyItems(0).Id = &H10E '// 0x010e as specified in EXIF standard
PropertyItems(0).Type = 2
PropertyItems(0).Len = NewDescription.Length
PropertyItems(0).Value = bDescription
Pic.SetPropertyItem(PropertyItems(0))
'// we cannot store in the same image, so use a temporary image instead
FilenameTemp = Filename + ".temp"
'// for lossless rewriting must rotate the image by 90 degrees!
EncParm = New EncoderParameter(Enc, CLng(EncoderValue.TransformRotate90))
EncParms.Param(0) = EncParm
'// now write the rotated image with new description
Pic.Save(FilenameTemp, CodecInfo, EncParms)
'// for computers with low memory and large pictures: release memory now
Pic.Dispose()
Pic = Nothing
GC.Collect()
'// delete the original file, will be replaced later
System.IO.File.Delete(Filename)
'// now must rotate back the written picture
Pic = Image.FromFile(FilenameTemp)
EncParm = New EncoderParameter(Enc, CLng(EncoderValue.TransformRotate270))
EncParms.Param(0) = EncParm
Pic.Save(Filename, CodecInfo, EncParms)
'// release memory now
Pic.Dispose()
Pic = Nothing
GC.Collect()
'// delete the temporary picture
System.IO.File.Delete(FilenameTemp)
End Sub
End Class
-----
P.S.
このクラスをそのまま、ファイルに落としても動かないと思います。
元情報をそのまま移植したため。お勉強お勉強w
分類:[.NET]
お世話になっております。
今回の質問はJPEG画像の回転時に画像の劣化をしないで回転するには?なのですが実は既にそれらしきソースがありましたので、ご紹介したいと思います。
つきましてはソースコードがC#.NETでして、私はVB.NETしか分かりません、ほんとにロスレスでJPEG画像を回転出来るのか知りたいのです。願わくばVB.NETにしたソースに、どなたか書き直していただけませんでしょうか?。又分かってしまった方、ソースだけもらっっチャオなんて思わないで救いの手を〜(結構見つけるの苦労したものでごほうびに!!!あっなんかこんなんだれでも知ってるよって場合もあるかな(汗))
それではソースのご紹介&URL
http://www.eggheadcafe.com/articles/20030706.asp
/////////////////////////////////////////////////
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for(j = 0; j < encoders.Length; ++j)
{
if(encoders[j].MimeType == mimeType)
return encoders[j];
} return null;
}
private void WriteNewDescriptionInImage(string Filename,string NewDescription)
{
Image Pic;
PropertyItem[] PropertyItems;
byte[] bDescription=new Byte[NewDescription.Length];
int i;
string FilenameTemp;
Encoder Enc=Encoder.Transformation;
EncoderParameters EncParms=new EncoderParameters(1);
EncoderParameter EncParm;
ImageCodecInfo CodecInfo=GetEncoderInfo("image/jpeg");
// copy description into byte array
for (i=0;i<NewDescription.Length;i++) bDescription[i]=(byte)NewDescription[i];
// load the image to change
Pic=Image.FromFile(Filename);
// put the new description into the right property item
PropertyItems=Pic.PropertyItems;
PropertyItems[0].Id=0x010e; // 0x010e as specified in EXIF standard
PropertyItems[0].Type=2;
PropertyItems[0].Len=NewDescription.Length;
PropertyItems[0].Value=bDescription;
Pic.SetPropertyItem(PropertyItems[0]);
// we cannot store in the same image, so use a temporary image instead
FilenameTemp=Filename+".temp";
// for lossless rewriting must rotate the image by 90 degrees!
EncParm=new EncoderParameter(Enc,(long)EncoderValue.TransformRotate90);
EncParms.Param[0]=EncParm;
// now write the rotated image with new description
Pic.Save(FilenameTemp,CodecInfo,EncParms);
// for computers with low memory and large pictures: release memory now
Pic.Dispose();
Pic=null;
GC.Collect();
// delete the original file, will be replaced later
System.IO.File.Delete(Filename);
// now must rotate back the written picture
Pic=Image.FromFile(FilenameTemp);
EncParm=new EncoderParameter(Enc,(long)EncoderValue.TransformRotate270);
EncParms.Param[0]=EncParm;
Pic.Save(Filename,CodecInfo,EncParms);
// release memory now
Pic.Dispose();
Pic=null;
GC.Collect();
// delete the temporary picture
System.IO.File.Delete(FilenameTemp);
}
////////////////////////////////