Установите значение DPI в Tiff Image в C # - PullRequest
2 голосов
/ 21 июня 2010

Я пытаюсь установить значение dpi для TIFF изображения в C # с помощью кода, но почему-то значения не сохраняются после сохранения изображения.

using (var image = new Bitmap(@"c:\newimage.tif"))
{
    uint[] uintArray = { 300, 1}; //Setting DPI as 300
    byte[] bothArray = ConvertUintArrayToByteArray(uintArray);
    PropertyItem item = image.PropertyItems.Where(p => p.Id == 0x11A).Single();
    var val = BitConverter.ToUInt32(item.Value, 0);
    Console.WriteLine(val);
    item.Id = 0x11A;
    item.Value = bothArray;
    item.Type = 5;
    item.Len = item.Value.Length;
    image.SetPropertyItem(item);
    image.Save(@"c:\newimage1.tif"); //Save image to new File
}

Что не так с этим кодом? Любая помощь будет оценена. Определения тегов файла TIFF

Ответы [ 3 ]

5 голосов
/ 22 июня 2010

Установка значения свойства и разрешения растрового изображения, а затем повторное сохранение изображения должны изменить разрешение (это сработало на моем образце изображения).Я полагаю, что в исходном файле должны присутствовать теги для разрешения X и Y, но не уверен, что .NET добавит эти теги, если их нет (придется тестировать).

Вот пример чтения и записиРазрешение X и Y для изображения TIFF с использованием .NET:

int numerator, denominator;

using (Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\input.tif"))
{
    // obtain the XResolution and YResolution TIFFTAG values
    PropertyItem piXRes = bmp.GetPropertyItem(282);
    PropertyItem piYRes = bmp.GetPropertyItem(283);

    // values are stored as a rational number - numerator/denominator pair
    numerator = BitConverter.ToInt32(piXRes.Value, 0);
    denominator = BitConverter.ToInt32(piXRes.Value, 4);
    float xRes = numerator / denominator;

    numerator = BitConverter.ToInt32(piYRes.Value, 0);
    denominator = BitConverter.ToInt32(piYRes.Value, 4);
    float yRes = numerator / denominator;

    // now set the values
    byte[] numeratorBytes = new byte[4];
    byte[] denominatorBytes = new byte[4];

    numeratorBytes = BitConverter.GetBytes(600); // specify resolution in numerator
    denominatorBytes = BitConverter.GetBytes(1);

    Array.Copy(numeratorBytes, 0, piXRes.Value, 0, 4); // set the XResolution value
    Array.Copy(denominatorBytes, 0, piXRes.Value, 4, 4);

    Array.Copy(numeratorBytes, 0, piYRes.Value, 0, 4); // set the YResolution value
    Array.Copy(denominatorBytes, 0, piYRes.Value, 4, 4);

    bmp.SetPropertyItem(piXRes); // finally set the image property resolution
    bmp.SetPropertyItem(piYRes);

    bmp.SetResolution(600, 600); // now set the bitmap resolution

    bmp.Save(@"C:\output.tif"); // save the image
}
3 голосов
/ 21 июня 2010

Я подозреваю, что растровое разрешение переопределит свойство. Используйте Bitmap.SetResolution ().

0 голосов
/ 21 июня 2010

отказ от ответственности: я работаю на Atalasoft , который делает продукты для работы с изображениями через .NET.

Вы можете сделать это в dotImage, используя класс TiffDocument с кодом, подобным этому:*

private void RemoveIfContains(TiffTagCollection tags, int tagID)
{
    TiffTag tag = tags.LookupTag(tagID);
    if (tag != null)
       tags.Remove(tag);
}

public void SetTiffResolution(string tiffin, string tiffout, int page, double resolution ) {
    if (tiffin == tiffout)
       throw new ArgumentException(tiffout, "output path must be different from input path");
    TiffFile tf = new TiffFile();
    using (FileStream stm = new FileStream(tiffin, FileMode.Open, FileAccess.Read, FileShare.Read)) {
        tf.Read(stm);
        TiffDirectory image = tf.Images[page];
        RemoveIfContains(image.Tags, TiffTagID.ResolutionX);
        RemoveIfContains(image.Tags, TiffTagID.ResolutionY);
        RemoveIfContains(image.Tags, TiffTagID.ResolutionUnit);
        image.Tags.Add(new TiffTag(TiffTagID.ResolutionX, resolution);
        image.Tags.Add(new TiffTag(TiffTagID.ResolutionY, resolution);
        image.Tags.Add(new TiffTag(TiffTagID.ResolutionUnit, 2)); // 2 == dots per INCH
        tf.Save(tiffout);
    }
}           

Преимущества несколько - прямой доступ к тегам позволяет вам устанавливать вещи так, как вы хотите, без перекодирования изображения.Если ваше исходное изображение было сжато JPEG в TIFF, вам не нужно беспокоиться о проблемах с перекодированием данных JPEG и потерей информации.Кроме того, вам не нужно беспокоиться о потере информации о тегах TIFF, которая уже была там.Этот код также работает на многостраничных TIFF.Наконец, это, вероятно, будет более быстрый подход, чем декодирование всего изображения просто для изменения тега.

Недостаток этого подхода в том, что вам действительно нужно понимать спецификацию TIFF.Без этого понимания вы рискуете создать файлы, которые не всегда могут быть проанализированы.DotImage и IrfanView, например, очень снисходительны в использовании всевозможных сломанных TIFF.Adobe PhotoShop общеизвестно строг.

...