首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetResolution在连接tiff映像时什么也不做

SetResolution在连接tiff映像时什么也不做
EN

Stack Overflow用户
提问于 2014-11-04 06:07:13
回答 2查看 719关注 0票数 1

我一直在尝试调整一个新的tiff的分辨率,这个新的tiff是从一组其他的tiff中创建的。我想把决议降到100x100dpi。join的所有内容都正常工作,但是在最后的tiff中的分辨率始终是我要连接的文件的分辨率(使用300x300dpi图像)。我尝试过使用一些建议(Set DPI value to Tiff Image in C#)来获取/设置PropertyItems,但这也失败了。使用下面的联接技术,将最终图像的分辨率设置为100x100dpi的正确方法是什么?

谢谢。

代码语言:javascript
复制
public byte[] JoinTiffImages(
        List<byte[]> images)
    {
        var fPage = FrameDimension.Page;

        var nearest =
            System.Drawing
                  .Drawing2D
                  .InterpolationMode
                  .NearestNeighbor;

        if (images.Count == 0)
        {
            throw new ImageConverterException(
                "Could not join an empty set of images.");
        }
        else if (images.Count == 1)
        {
            return images[0];
        }
        else
        {
            using (var ms = new MemoryStream())
            {
                using (var masterBitmap =
                    (Bitmap)DrawingImage.FromStream(
                        new MemoryStream(images[0])))
                {
                    //get the codec for tiff files
                    var info = GetTifCodecInfo();
                    var enc = Encoder.SaveFlag;
                    var ep = new EncoderParameters(2);

                    ep.Param[0] = new EncoderParameter(
                        enc,
                        (long)EncoderValue.MultiFrame);

                    ep.Param[1] = new EncoderParameter(
                        Encoder.Compression,
                        (long)TifCompression.ToEncoderValue());

                    masterBitmap.SetResolution(100.0f, 100.0f);
                    masterBitmap.Save(ms, info, ep);

                    //save the intermediate frames
                    ep.Param[0] = new EncoderParameter(
                        enc,
                        (long)EncoderValue.FrameDimensionPage);

                    for (int i = 1; i < images.Count; i++)
                    {
                        using (var nextImg = (Bitmap)DrawingImage.FromStream(
                            new MemoryStream(images[i])))
                        {
                            for (int x = 0;
                                    x < nextImg.GetFrameCount(fPage);
                                    x++)
                            {
                                nextImg.SetResolution(100.0f, 100.0f);
                                nextImg.SelectActiveFrame(fPage, x);

                                masterBitmap.SaveAdd(nextImg, ep);
                            }
                        }
                    }

                    ep.Param[0] =
                        new EncoderParameter(
                            enc,
                            (long)EncoderValue.Flush);

                    //close out the file.
                    masterBitmap.SaveAdd(ep);

                    return ms.ToArray();
                }
            }
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-04 20:23:51

在这些评论的帮助下,我解决了我的问题。此函数将在不改变图像大小的情况下处理分辨率变化。

代码语言:javascript
复制
public static byte[] JoinTiffImages(
    List<byte[]> images,
    float res)
{
    var fPage = FrameDimension.Page;

    var nearest =
        System.Drawing
                .Drawing2D
                .InterpolationMode
                .NearestNeighbor;

    if (images.Count == 0)
    {
        throw new Exception(
            "Could not join an empty set of images.");
    }
    else if (images.Count == 1)
    {
        return images[0];
    }
    else
    {
        var ms = new MemoryStream();

        //get the codec for tiff files
        var info = GetTifCodecInfo();
        var ep = new EncoderParameters(2);

        ep.Param[0] = new EncoderParameter(
            System.Drawing.Imaging.Encoder.SaveFlag,
            (long)EncoderValue.MultiFrame);

        ep.Param[1] = new EncoderParameter(
            System.Drawing.Imaging.Encoder.Compression,
            (long)EncoderValue.CompressionLZW);

        using (var masterImg =
            (Bitmap)System.Drawing.Image.FromStream(
                new MemoryStream(images[0])))
        {
            using (var resizedMaster =
                new Bitmap(
                    (int)(masterImg.Width *
                        (res /
                            masterImg.HorizontalResolution)),
                    (int)(masterImg.Height *
                        (res /
                            masterImg.VerticalResolution))))
            {
                resizedMaster.SetResolution(
                    res,
                    res);

                using (var gr = Graphics.FromImage(resizedMaster))
                {
                    gr.InterpolationMode = nearest;

                    gr.DrawImage(
                        masterImg,
                        new Rectangle(
                            0,
                            0,
                            resizedMaster.Width,
                            resizedMaster.Height),
                        0,
                        0,
                        masterImg.Width,
                        masterImg.Height,
                        GraphicsUnit.Pixel);
                }

                resizedMaster.Save(ms, info, ep);

                //save the intermediate frames
                ep.Param[0] = new EncoderParameter(
                    System.Drawing.Imaging.Encoder.SaveFlag,
                    (long)EncoderValue.FrameDimensionPage);

                for (int i = 1; i < images.Count; i++)
                {
                    using (var nextImg =
                        (Bitmap)System.Drawing.Image.FromStream(
                        new MemoryStream(images[i])))
                    {
                        for (int x = 0;
                            x < nextImg.GetFrameCount(fPage);
                            x++)
                        {
                            nextImg.SelectActiveFrame(fPage, x);

                            using (var resizedNext =
                                new Bitmap(
                                    (int)(nextImg.Width *
                                        (res /
                                            nextImg.HorizontalResolution)),
                                    (int)(nextImg.Height *
                                        (res /
                                            nextImg.VerticalResolution))))
                            {
                                resizedNext.SetResolution(
                                    res,
                                    res);

                                using (var gr =
                                    Graphics.FromImage(resizedNext))
                                {
                                    gr.InterpolationMode = nearest;
                                    gr.DrawImage(
                                        nextImg,
                                        new Rectangle(
                                            0,
                                            0,
                                            resizedNext.Width,
                                            resizedNext.Height),
                                        0,
                                        0,
                                        nextImg.Width,
                                        nextImg.Height,
                                        GraphicsUnit.Pixel);
                                }

                                resizedMaster.SaveAdd(resizedNext, ep);
                            }
                        }
                    }
                }

                ep.Param[0] =
                    new EncoderParameter(
                        System.Drawing.Imaging.Encoder.SaveFlag,
                        (long)EncoderValue.Flush);

                //close out the file.
                resizedMaster.SaveAdd(ep);
            }

            return ms.ToArray();
        }
    }
}

private static ImageCodecInfo GetTifCodecInfo()
{
    foreach (var ice in ImageCodecInfo.GetImageEncoders())
    {
        if (ice.MimeType == "image/tiff")
        {
            return ice;
        }
    }

    return null;
}
票数 1
EN

Stack Overflow用户

发布于 2014-11-04 16:56:02

下面是从图像列表创建多页tif文件的代码。它根据输入参数将DPI设置为主部件和所有部件。

代码语言:javascript
复制
private void saveTiff_Click(List<Image> imgList, string saveName,  int dpi)
{
    //all kudos to : http://bobpowell.net/generating_multipage_tiffs.aspx

    foreach (Image img in imgList) ((Bitmap)img).SetResolution(dpi, dpi);

    System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag;
    Bitmap master = new Bitmap(imgList[0]);
    master.SetResolution(dpi, dpi);
    ImageCodecInfo info = null;

    // lets hope we have an TIF encoder
    foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders())
        if (ice.MimeType == "image/tiff")  info = ice;

    // one parameter: MultiFrame
    EncoderParameters ep = new EncoderParameters(1);
    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
    master.Save(saveName, info, ep);

    // one parameter: further frames
    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage);
    for (int i = 1; i < imgList.Count; i++)  master.SaveAdd(imgList[i], ep);

    // one parameter: flush
    ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush);
    master.SaveAdd(ep);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26728762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档