- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法使用 .NET 创建带有 JPEG 压缩的多页 TIFF?
我可以使用 LZW 压缩创建 TIFF,但文件非常大。看起来像 EncoderValue
枚举(我用来设置压缩)甚至没有合适的成员。
最佳答案
你可以看看 >> this post , 我在这里解释了如何将现有的 JPEG 包装在一个简单的多页 TIFF 容器中。
但是还有其他各种可能性。 FreeImage.Net (freeimage.sourceforge.net) 是一个非常强大的库。您可以像这样创建一个简单的 JPEG 压缩 TIFF:
using FreeImageAPI;
// [...]
FIBITMAP image = FreeImage.Load(FREE_IMAGE_FORMAT.FIF_UNKNOWN, "filename", FREE_IMAGE_LOAD_FLAGS.DEFAULT);
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_TIFF, image, "filename", FREE_IMAGE_SAVE_FLAGS.TIFF_JPEG)
using System.IO;
using FreeImageAPI;
// [...]
public byte[] MergeTiffs(List<byte[]> tiffs)
{
byte[] multiPageTiff = null;
string tmpfile = "... chose any file name ...";
MemoryStream singleStream = null;
FIBITMAP fib = FIBITMAP.Zero;
FIMULTIBITMAP fmb = FIMULTIBITMAP.Zero;
using (singleStream = new MemoryStream(tiffs[0])
{
fib = FreeImage.LoadFromStream(singleStream);
FreeImage.SaveEx(fib, dateiname, FREE_IMAGE_FORMAT.FIF_TIFF, FREE_IMAGE_SAVE_FLAGS.TIFF_JPEG);
FreeImage.UnloadEx(ref fib);
}
fmb = FreeImage.OpenMultiBitmap(
FREE_IMAGE_FORMAT.FIF_TIFF,
tmpfile,
false,
false,
false,
FREE_IMAGE_LOAD_FLAGS.TIFF_JPEG);
for (int i = 1; i < tiffs.Count; i++)
{
using (singleStream = new MemoryStream(tiffs[i])
{
fib = FreeImage.LoadFromStream(singleStream);
FreeImage.AppendPage(fmb, fib);
}
}
FreeImage.CloseMultiBitmapEx(ref fmb);
multiPageTiff = File.ReadAllBytes(tmpfile);
File.Delete(tmpfile);
return file;
}
using System.IO
using BitMiracle.LibTiff.Classic;
// [...]
/// <summary>
/// Merges multiple TIFFs into one multi-page TIFF
/// </summary>
/// <param name="tiffs">The TIFFs' raw data (can also be multi-page)</param>
/// <returns></returns>
public static byte[] MergeTiffs(List<byte[]> tiffs)
{
// the byteStream will contain the merged tiff's raw data
MemoryStream byteStream = new MemoryStream();
// create the output-TIFF (empty stream)
using (Tiff output = Tiff.ClientOpen("InMemory", "w", byteStream, new TiffStream()))
{
for (short i = 0; i < tiffs.Count; i++)
{
// provide input-TIFF as custom TiffStream, with byteStream (output-TIFF) as output
TiffStreamForBytes tiffStream = new TiffStreamForBytes(tiffs[i]);
using (Tiff input = Tiff.ClientOpen("bytes", "r", null, tiffStream))
{
// *** now copy all the TIFF-data: ***
// copy all directories (= all pages)
int numberOfDirectories = input.NumberOfDirectories();
for (short d = 0; d < numberOfDirectories; ++d)
{
// set this as the current directory (to work in)
input.SetDirectory(d);
// copy all tags
for (ushort t = ushort.MinValue; t < ushort.MaxValue; ++t)
{
TiffTag tag = (TiffTag)t;
FieldValue[] tagValue = input.GetField(tag);
if (tagValue != null)
output.GetTagMethods().SetField(output, tag, tagValue);
}
// copy all strips
int numberOfStrips = input.NumberOfStrips();
int stripSize = input.StripSize();
for (int s = 0; s < numberOfStrips; ++s)
{
// buffer for the current strip
byte[] stripData = new byte[stripSize];
// read strip from input image (not decompressed)
int length = input.ReadRawStrip(s, stripData, 0, stripData.Length);
// write strip to output image (uncompressed)
output.WriteRawStrip(s, stripData, 0, length);
}
// add the new directory to output image
output.WriteDirectory();
}
}
}
}
// return the new TIFF as byte array
return byteStream.ToArray();
}
/// <summary>
/// Custom read-only stream for byte buffer that can be used
/// with Tiff.ClientOpen method.
/// </summary>
private class TiffStreamForBytes : TiffStream
{
private byte[] m_bytes;
private int m_position;
public TiffStreamForBytes(byte[] bytes)
{
m_bytes = bytes;
m_position = 0;
}
public override int Read(object clientData, byte[] buffer, int offset, int count)
{
if ((m_position + count) > m_bytes.Length)
return -1;
Buffer.BlockCopy(m_bytes, m_position, buffer, offset, count);
m_position += count;
return count;
}
public override void Write(object clientData, byte[] buffer, int offset, int count)
{
throw new InvalidOperationException("This stream is read-only");
}
public override long Seek(object clientData, long offset, SeekOrigin origin)
{
switch (origin)
{
case SeekOrigin.Begin:
if (offset > m_bytes.Length)
return -1;
m_position = (int)offset;
return m_position;
case SeekOrigin.Current:
if ((offset + m_position) > m_bytes.Length)
return -1;
m_position += (int)offset;
return m_position;
case SeekOrigin.End:
if ((m_bytes.Length - offset) < 0)
return -1;
m_position = (int)(m_bytes.Length - offset);
return m_position;
}
return -1;
}
public override void Close(object clientData)
{
// nothing to do
}
public override long Size(object clientData)
{
return m_bytes.Length;
}
}
关于.net - 使用 .NET 创建带 JPEG 压缩的多页 TIFF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814254/
在 Google 和许多 DICOM 章节中可以轻松找到有关 JPEG-LS 的信息。 但是,也有提到 JPEG-LL 的链接/页面/阅读资料。但是,我更深入地研究了 DICOM 标准,没有一章提到过
我有一个关于 DICOM 标准和 libjpeg 库的问题。在 DICOM 标准中,除其他外,还有传输语法: JPEG Lossless, Nonhierarchical, First- Order
APP0 到 APP15 标记每个只支持 65535 字节(我从 libjpeg.doc 中读到的)。如果要在 jpeg 文件中保存更大的数据 block 怎么办? 最佳答案 没有限制使用多个相同类型
我正在尝试构建一个上传器,它分两步上传渐进式文件: 上传最小字节数以创建缩略图 (0-10%) 上传缩略图的其余字节。 (11%-100%) 我想这样做是为了让缩略图更早可用,而不必上传单独的缩略图。
所以,假设我有一个大版本的图像,它只显示为缩略图。是否可以通过使用渐进式 jpeg 来避免为缩略图创建单独的文件,在达到一定数量的扫描时停止加载,并且仅在用户选择完全打开它时继续加载? 如果是这样,如
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我想从 jpeg 中提取缩略图,无需任何外部库。我的意思是这并不太困难,因为我需要知道缩略图在文件中的开始位置和结束位置,然后简单地剪切它。我研究了许多文档(即: http://www.media.m
当 decoding entropy encoded DC values in JPEG (或 entropy encoded prediction differences in lossless J
问题是:如何区分两个文件?一个用 JPEG 编码,另一个用 JPEG2000 编码。 我需要特定于格式的文件读/写函数,我无法在不读取的情况下找到文件编码。JPEG 现在工作正常,但 JPEG fun
是否有结束 exif/end-of-xmp/end-of-iptc/start-of-data 标记,我可以用它来获取 jpg/jpeg(和其他图像格式)的数据部分的校验和? 最佳答案 我认为这个问题
不久前我收到一封电子邮件,其中包含图像附件。从那时起,hotmail 似乎已停止为我托管图像,因为当我打开邮件时,图像不再可用。 但是,消息源仍然完好无损,如果我没记错的话,消息源 - 以文本形式 -
我有一个提供高质量 MJPEG 的网络摄像头。 我需要通过网络发送小的、低质量的 JPEG。我的硬件是树莓派(700MHz ARM)。我希望代码使用尽可能少的 CPU 能力,并尽可能少地增加延迟。我可
有一个question with the same title但不幸的是它对我没有帮助。 我正在尝试解析 SOS 标记的数据。我能找到的所有文档都说在标记( 0xFFDA )之后是一个两字节的数字,它
每个人! 我处理来自 IP 摄像机的视频,并编写了基于解压缩视频分析的运动检测算法。但我真的更快。我找到了几篇关于压缩域分析的论文,但没有找到任何实现。 谁能推荐我一些代码? 找到的 Material
我在一个网站上工作,该网站涉及显示来自各种在线零售商的大量产品图片。由于大部分页面权重都在图像中,因此我认为值得研究一下减少文件大小的技术。 图像已经是 JPEG。我知道 PNG 有很多多余的东西,可
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我有一个网络画廊,我在其中显示用户上传的文件大小和分辨率各不相同的图像。目前所有图像都是基线。所以我想知道如果我将它们转换为逐行图像是否真的会产生重大影响。使用渐进式图像的优点和缺点是什么。 最佳答案
我在许多链接和网站上保持头脑,但未能得到答案。我不想问这个,我知道 JPEG 压缩,它只制作压缩图像。甚至 Motion JPEG 也会制作压缩图像 I 帧。我的问题是有什么区别。我正在为需要发送视频
我是一名优秀的程序员,十分优秀!