ビットマップの配列を TIFF 形式の新しいイメージに変換し、すべてのビットマップをこの新しい tiff イメージのフレームとして追加するにはどうすればよいですか?
.NET 2.0 を使用しています。
最初のビットマップをImageオブジェクトに配置して開始します
Bitmap bitmap = (Bitmap)Image.FromFile(file);
ビットマップをtiffとしてメモリに保存します
MemoryStream byteStream = new MemoryStream();
bitmap.Save(byteStream, ImageFormat.Tiff);
Tiffを別のImageオブジェクトに入れます
Image tiff = Image.FromStream(byteStream)
エンコーダーを準備します。
var encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
EncoderParameters encoderParams = new EncoderParameters(2);
encoderParams.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);
encoderParams.Param[1] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ファイルに保存:
tiff.Save(sOutFilePath, encoderInfo, encoderParams);
以降のページでは、エンコーダーを準備します。
EncoderParameters EncoderParams = new EncoderParameters(2);
EncoderParameter SaveEncodeParam = new EncoderParameter(
Encoder.SaveFlag,
(long)EncoderValue.FrameDimensionPage);
EncoderParameter CompressionEncodeParam = new EncoderParameter(
Encoder.Compression, (long)EncoderValue.CompressionNone);
EncoderParams.Param[0] = CompressionEncodeParam;
EncoderParams.Param[1] = SaveEncodeParam;
tiff.SaveAdd(/* next image as tiff - do the same as above with memory */, EncoderParams);
最後にファイルをフラッシュします。
EncoderParameter SaveEncodeParam = new EncoderParameter(
Encoder.SaveFlag, (long)EncoderValue.Flush);
EncoderParams = new EncoderParameters(1);
EncoderParams.Param[0] = SaveEncodeParam;
tiff.SaveAdd(EncoderParams);
それはあなたが始めるはずです。
Googleで少し検索した後、この投稿に出くわしました。a'b'c'd'e'f'g'h' の投稿にあるコードを試してみましたが、うまくいきませんでした。おそらく、私は何かを正しくしていませんでした。
いずれにせよ、画像を複数ページの tiff に保存する別の投稿を見つけました。投稿へのリンクは次のとおりです:フレームをマルチフレーム TIFF に追加します。
また、ここに私のために働いたコードがあります。その投稿と同じである必要があります。
Encoder encoder = Encoder.SaveFlag;
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);
// Save the first frame of the multi page tiff
Bitmap firstImage = (Bitmap) _scannedPages[0].RawContent;
firstImage.Save(fileName, encoderInfo, encoderParameters);
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage);
// Add the remaining images to the tiff
for (int i = 1; i < _scannedPages.Count; i++)
{
Bitmap img = (Bitmap) _scannedPages[i].RawContent;
firstImage.SaveAdd(img, encoderParameters);
}
// Close out the file
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
firstImage.SaveAdd(encoderParameters);
役立つトピック。情報をありがとう。base64 でエンコードされた文字列の配列から複数ページの画像をステッチする必要がありました。このスレの情報を元にまとめてみました。明示的に指定された画像形式でメモリストリームを作成する必要がある理由がよくわかりませんが、これが機能するようになりました。これに対処するより良い方法があれば教えてください。ありがとう
/// <summary>
/// Takes in an array of base64 encoded strings and creates a multipage tiff.
/// </summary>
/// <param name="sOutFile">file to be generated</param>
/// <param name="pagesbase64Array"></param>
private void SaevAsMultiPageTiff(string sOutFile, string[] pagesbase64Array)
{
System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag;
ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff");
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);
Bitmap firstImage = null;
try
{
using (MemoryStream ms1 = new MemoryStream())
{
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[0])))
{
Image.FromStream(ms).Save(ms1, ImageFormat.Tiff);
firstImage = (Bitmap)Image.FromStream(ms1);
}
// Save the first frame of the multi page tiff
firstImage.Save(sOutFile, encoderInfo, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called
}
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage);
Bitmap imagePage;
// Add the remining images to the tiff
for (int i = 1; i < pagesbase64Array.Length; i++)
{
using (MemoryStream ms1 = new MemoryStream())
{
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(pagesbase64Array[i])))
{
Image.FromStream(ms).Save(ms1, ImageFormat.Tiff);
imagePage = (Bitmap)Image.FromStream(ms1);
}
firstImage.SaveAdd(imagePage, encoderParameters); //throws Generic GDI+ error if the memory streams are not open when this is called
}
}
}
catch (Exception)
{
//ensure the errors are not missed while allowing for flush in finally block so files dont get locked up.
throw;
}
finally
{
// Close out the file
encoderParameters.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
firstImage.SaveAdd(encoderParameters);
}
}
標準化された形式のファイルの処理と作成に関しては、Microsoftの実績のファンではないので、MagickNetの形式で.Netライブラリとして利用できるImageMagickを使用することをお勧めします( http://midimick.com/magicknet/に注意してください) 。現在、スパイウェアのポップアップがあります。サイトの所有者に警告しました)。