티파니 파일의 마지막 페이지에서 몇 가지 작업을해야합니다. 그래서 아래의 예제 코드를 작성했는데 작동하지만 천천히 작동합니다. 코드는 결국 조금씩 실행될 것이고 속도를 올려야합니다.전체 파일을 쓰지 않고 다중 페이지 티파니를 저장합니다.
나는 멀티 스레드 방식을 사용하여 연주 해왔다.하지만 결국에는 모든 데이터가 동일한 파일에 쓰여 져야하고 시간이 많이 걸리는 부분으로 보인다.
전 마지막 페이지에서만 작업하는 방법이나 아직 고려하지 않은 것을 보여줄 수있는 답변이 필요합니다.
private void rotateLastPage() {
string inputfile = "C:\\input.tif";
string tmpfile = inputfile + ".tmp";
Bitmap bmap = (Bitmap)Image.FromFile(inputfile);
int max = bmap.GetFrameCount(FrameDimension.Page);
Image[] images = new Image[max];
int i;
for (i = 0; i < max; i++)
{
bmap.SelectActiveFrame(FrameDimension.Page, i);
images[i] = (Image)bmap.Clone();
}
bmap.Dispose();
Bitmap pages = null;
i = 0;
foreach(Image image in images)
{
try
{
if (i == max - 1)
{
image.RotateFlip(RotateFlipType.Rotate90FlipNone);
}
EncoderParameters encoderParameters = new EncoderParameters(2);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
Int16 c = BitConverter.ToInt16(image.PropertyItems[Array.IndexOf(image.PropertyIdList, 0x103)].Value, 0);
if (c != 4 && c != 5)
{
throw new ArgumentException("Only CCIT4 and LZW compressed images are allowed.");
}
else if (c == 4)
{
encoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
}
else if (c == 5)
{
encoderParameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
}
if (i == 0)
{
pages = (Bitmap)image;
ImageCodecInfo encoder = getTiffEncoder();
pages.Save(tmpfile, encoder, encoderParameters);
}
else
{
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
pages.SaveAdd(image, encoderParameters);
}
if (i == max - 1)
{
encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.SaveFlag, (long)EncoderValue.Flush);
pages.SaveAdd(encoderParameters);
}
i++;
}
catch (Exception e)
{
Console.WriteLine(String.Format("Unable to rotate page {0} in file {1} due to {2}", (i + 1).ToString(), inputfile, e.Message));
break;
}
}
foreach (Image image in images) {
image.Dispose();
}
pages.Dispose();
// eventually overwrite input file with tmp file
}
private static ImageCodecInfo getTiffEncoder()
{
ImageCodecInfo encoder = null;
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int i = 0; i < encoders.Length; i++)
{
if (encoders[i].MimeType == "image/tiff")
{
encoder = encoders[i];
}
}
if (encoder == null)
{
throw new NotSupportedException("Unable to find a tiff encoder.");
}
return encoder;
}
을
편집 : (EDIT 작동하지 않을 것) 제목을 수정했습니다. [ "제목에"태그에 "태그가 포함되어 있어야합니까?"] (http://meta.stackexchange.com/questions/19190/), 컨센서스는 "아니오, 그렇지 않아야합니다."를 참조하십시오. – Default