[PS CC2023] Неоправданно большой jpg. Размер 1200x1200px весит 120 Мб

  • Автор темы Автор темы big bear
  • Дата начала Дата начала
А вот такую картинку
yakut.jpg
не хотите ли? Присланный файлик - 181 Мб (будь там куча слоев, я бы и не удивлялась), после переноса всх слоев, кроме background в новый файл - имеем 23,3 Мб. Да еще исходник тормозил при любом действии, хотя у меня тут и по паре гигов файлы не редкость
 
Последнее редактирование:
Понятно что метадаты. Непонятно, почему в Фотошопе нет стандартного метода очистки именно psd - про jpg все ясно.
А JPG разве есть? Пересохранение не предлагать. По-моему, только при пересохранении можно в JPG убить метадату Фотошопом, и то либо экспортом, либо Save for Web?
 
А JPG разве есть? Пересохранение не предлагать. По-моему, только при пересохранении можно в JPG убить метадату Фотошопом, и то либо экспортом, либо Save for Web?
Как выяснилось, можно еще слои сдублировать в новый файл, отслеживая, не превратиться ли он с каким-то слоем в тыкву. В моем случае сдублировалось все, получился файл в ожидаемые 23 Мб и... файл с белым background весом в 173 Мб
Желающие могут полюбоваться
 
Не, там километровая простыня рассуждений о том, как бы избавиться от лишнего, пара вариантов, не устроивших их писателей, и даже предлагается автоматизировать перенос слоев в новый файл, ха-ха.
Где-то я встречала способ с новым шаблоном, может там что дельное будет. А из вышеуказанного топика я узнала, что такая залипуха теперь бывает и с Индизайном.
 
километровая простыня рассуждений
Ну, с твоим файлом то этот код справился :)
JavaScript:
/* Remove All Metadata & Retain Layers v2 - a brute force alternative to ExifTool
https://community.adobe.com/t5/photoshop/script-to-remove-all-meta-data-from-the-photo/m-p/10400906
Script to remove all metadata from the photo
30th July 2020 Update */

#target photoshop
app.bringToFront();

/* FLATTENED */
if (app.activeDocument.activeLayer.isBackgroundLayer) {
    // alert('Flattened image...');
    // Call function to duplicate all layers
    DupeSelectedLayers.main = function () {
        DupeSelectedLayers();
    };
    DupeSelectedLayers.main();
    alertMessage();
}

/* SINGLE (TRANSPARENT) LAYER BUG WORKAROUND */
else if (app.activeDocument.layers.length === 1) {
    // alert('Single layer image...');
    // Set the original doc
    var sourceDoc = app.activeDocument;
    // Add a randomly named temp layer
    app.activeDocument.artLayers.add();
    app.activeDocument.activeLayer.name = "2563@361#47&-TEMP_LAYER";
    // Select all layers and layer groups/sets!
    selectAllLayers();
    // Call function to duplicate all layers
    DupeSelectedLayers.main = function () {
        DupeSelectedLayers();
    };
    DupeSelectedLayers.main();
    // Select & remove temporary layer
    removeTempLayer(false);
    // Set the duplicated document
    var dupedDoc = app.activeDocument;
    // Switch back to the original doc
    app.activeDocument = sourceDoc;
    // Select & remove temporary layer
    removeTempLayer(false);
    // Set the duped doc as the active doc
    app.activeDocument = dupedDoc;
    alertMessage();
}

/* MULTIPLE LAYERS */
else {
    // alert('Multiple layer image...');
    // Select all layers and layer groups/sets!
    selectAllLayers();
    // Call function to duplicate all layers
    DupeSelectedLayers.main = function () {
        DupeSelectedLayers();
    };
    DupeSelectedLayers.main();
    alertMessage();
}

///// START FUNCTIONS /////

function selectAllLayers() {
    // https://feedback.photoshop.com/photoshop_family/topics/i-cant-record-sellect-all-layers-in-script-listener-and-in-actions
    var c2t = function (s) {
        return app.charIDToTypeID(s);
    };

    var s2t = function (s) {
        return app.stringIDToTypeID(s);
    };

    var descriptor = new ActionDescriptor();
    var descriptor2 = new ActionDescriptor();
    var reference = new ActionReference();
    var reference2 = new ActionReference();

    reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
    descriptor.putReference(c2t("null"), reference2);
    executeAction(s2t("selectAllLayers"), descriptor, DialogModes.NO);
    reference.putProperty(s2t("layer"), s2t("background"));
    descriptor2.putReference(c2t("null"), reference);
    descriptor2.putEnumerated(s2t("selectionModifier"), s2t("selectionModifierType"), s2t("addToSelection"));
    descriptor2.putBoolean(s2t("makeVisible"), false);
    try {
        executeAction(s2t("select"), descriptor2, DialogModes.NO);
    } catch (e) { }
}

// Duplicate all selected layers to new document 
function DupeSelectedLayers() {
    function step1(enabled, withDialog) {
        if (enabled !== undefined && !enabled)
            return;
        cTID = function (s) {
            return app.charIDToTypeID(s);
        };
        sTID = function (s) {
            return app.stringIDToTypeID(s);
        };
        var origFilename = app.activeDocument.name.replace(/\.[^\.]+$/, ''); // Remove filename extension from original
        var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO);
        var desc1 = new ActionDescriptor();
        var ref1 = new ActionReference();
        ref1.putClass(cTID('Dcmn'));
        desc1.putReference(cTID('null'), ref1);
        // Use the original document filename + suffix
        desc1.putString(cTID('Nm  '), origFilename + "_NoMetadata");
        // Use the original document filename, beware overwriting the original file and losing all metadata!
        // desc1.putString(cTID('Nm  '), origFilename );               
        var ref2 = new ActionReference();
        ref2.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt'));
        desc1.putReference(cTID('Usng'), ref2);
        desc1.putInteger(cTID('Vrsn'), 5);
        executeAction(cTID('Mk  '), desc1, dialogMode);
    }

    step1();
}

function removeTempLayer(makeVisible) {
    // Select & remove temporary layer
    var c2t = function (s) {
        return app.charIDToTypeID(s);
    };
    var s2t = function (s) {
        return app.stringIDToTypeID(s);
    };
    var descriptor = new ActionDescriptor();
    var list = new ActionList();
    var reference = new ActionReference();
    reference.putName(s2t("layer"), "2563@361#47&-TEMP_LAYER");
    descriptor.putReference(c2t("null"), reference);
    descriptor.putBoolean(s2t("makeVisible"), makeVisible);
    list.putInteger(3);
    descriptor.putList(s2t("layerID"), list);
    executeAction(s2t("select"), descriptor, DialogModes.NO);
    app.activeDocument.activeLayer.remove();
}

function alertMessage() {
    alert('File duplicated to remove metadata with "_NoMetadata" suffix added to the filename for safety.' + '\r' + 'Note: guides, color samplers, alpha channels, paths and other common document additions have not been copied.');

}

///// FINISH FUNCTIONS /////
 
Ну, с твоим файлом то этот код справился :)
Я и сама с ним справилась, додумавшись до дублирования в новый файл примерно за полчаса. К счастью, это был первый файл с таким глюком
 
Ну ещё как вариант без переноса слоёв из файла в файл убить
Код:
photoshop:DocumentAncestors
в метаданных при помощи exiftool:
Код:
exiftool -r -XMP-photoshop:DocumentAncestors= имяфайла
(после = нужен пробел).
 
Последнее редактирование:
Ну, с твоим файлом то этот код справился :)
JavaScript:
/* Remove All Metadata & Retain Layers v2 - a brute force alternative to ExifTool
https://community.adobe.com/t5/photoshop/script-to-remove-all-meta-data-from-the-photo/m-p/10400906
Script to remove all metadata from the photo
30th July 2020 Update */

#target photoshop
app.bringToFront();

/* FLATTENED */
if (app.activeDocument.activeLayer.isBackgroundLayer) {
    // alert('Flattened image...');
    // Call function to duplicate all layers
    DupeSelectedLayers.main = function () {
        DupeSelectedLayers();
    };
    DupeSelectedLayers.main();
    alertMessage();
}

/* SINGLE (TRANSPARENT) LAYER BUG WORKAROUND */
else if (app.activeDocument.layers.length === 1) {
    // alert('Single layer image...');
    // Set the original doc
    var sourceDoc = app.activeDocument;
    // Add a randomly named temp layer
    app.activeDocument.artLayers.add();
    app.activeDocument.activeLayer.name = "2563@361#47&-TEMP_LAYER";
    // Select all layers and layer groups/sets!
    selectAllLayers();
    // Call function to duplicate all layers
    DupeSelectedLayers.main = function () {
        DupeSelectedLayers();
    };
    DupeSelectedLayers.main();
    // Select & remove temporary layer
    removeTempLayer(false);
    // Set the duplicated document
    var dupedDoc = app.activeDocument;
    // Switch back to the original doc
    app.activeDocument = sourceDoc;
    // Select & remove temporary layer
    removeTempLayer(false);
    // Set the duped doc as the active doc
    app.activeDocument = dupedDoc;
    alertMessage();
}

/* MULTIPLE LAYERS */
else {
    // alert('Multiple layer image...');
    // Select all layers and layer groups/sets!
    selectAllLayers();
    // Call function to duplicate all layers
    DupeSelectedLayers.main = function () {
        DupeSelectedLayers();
    };
    DupeSelectedLayers.main();
    alertMessage();
}

///// START FUNCTIONS /////

function selectAllLayers() {
    // https://feedback.photoshop.com/photoshop_family/topics/i-cant-record-sellect-all-layers-in-script-listener-and-in-actions
    var c2t = function (s) {
        return app.charIDToTypeID(s);
    };

    var s2t = function (s) {
        return app.stringIDToTypeID(s);
    };

    var descriptor = new ActionDescriptor();
    var descriptor2 = new ActionDescriptor();
    var reference = new ActionReference();
    var reference2 = new ActionReference();

    reference2.putEnumerated(s2t("layer"), s2t("ordinal"), s2t("targetEnum"));
    descriptor.putReference(c2t("null"), reference2);
    executeAction(s2t("selectAllLayers"), descriptor, DialogModes.NO);
    reference.putProperty(s2t("layer"), s2t("background"));
    descriptor2.putReference(c2t("null"), reference);
    descriptor2.putEnumerated(s2t("selectionModifier"), s2t("selectionModifierType"), s2t("addToSelection"));
    descriptor2.putBoolean(s2t("makeVisible"), false);
    try {
        executeAction(s2t("select"), descriptor2, DialogModes.NO);
    } catch (e) { }
}

// Duplicate all selected layers to new document
function DupeSelectedLayers() {
    function step1(enabled, withDialog) {
        if (enabled !== undefined && !enabled)
            return;
        cTID = function (s) {
            return app.charIDToTypeID(s);
        };
        sTID = function (s) {
            return app.stringIDToTypeID(s);
        };
        var origFilename = app.activeDocument.name.replace(/\.[^\.]+$/, ''); // Remove filename extension from original
        var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO);
        var desc1 = new ActionDescriptor();
        var ref1 = new ActionReference();
        ref1.putClass(cTID('Dcmn'));
        desc1.putReference(cTID('null'), ref1);
        // Use the original document filename + suffix
        desc1.putString(cTID('Nm  '), origFilename + "_NoMetadata");
        // Use the original document filename, beware overwriting the original file and losing all metadata!
        // desc1.putString(cTID('Nm  '), origFilename );              
        var ref2 = new ActionReference();
        ref2.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt'));
        desc1.putReference(cTID('Usng'), ref2);
        desc1.putInteger(cTID('Vrsn'), 5);
        executeAction(cTID('Mk  '), desc1, dialogMode);
    }

    step1();
}

function removeTempLayer(makeVisible) {
    // Select & remove temporary layer
    var c2t = function (s) {
        return app.charIDToTypeID(s);
    };
    var s2t = function (s) {
        return app.stringIDToTypeID(s);
    };
    var descriptor = new ActionDescriptor();
    var list = new ActionList();
    var reference = new ActionReference();
    reference.putName(s2t("layer"), "2563@361#47&-TEMP_LAYER");
    descriptor.putReference(c2t("null"), reference);
    descriptor.putBoolean(s2t("makeVisible"), makeVisible);
    list.putInteger(3);
    descriptor.putList(s2t("layerID"), list);
    executeAction(s2t("select"), descriptor, DialogModes.NO);
    app.activeDocument.activeLayer.remove();
}

function alertMessage() {
    alert('File duplicated to remove metadata with "_NoMetadata" suffix added to the filename for safety.' + '\r' + 'Note: guides, color samplers, alpha channels, paths and other common document additions have not been copied.');

}

///// FINISH FUNCTIONS /////
Так вроде ж, в модели есть доступ к XMP, зачем такие сложности?
 
В Фотошопе метаданные могут внедряться не только на уровне документа, но и на уровне слоя (при переносе в новый документ метаданные в слое удалятся только если он копируется как массив пикселов, а не как объект). Также отдельная веселуха со смарт-объектами: он может иметь метаданные и как слой и как документ (так как по сути является встроенным документом). А ещё ведь и бывают смарт объекты внутри других смарт объектов 🤣 Также попадались веселые истории с наложением разных версий XMP метаданных друг на друга, (когда выпадают те или иные секции метаданных - глазами их в файле видишь, а скриптом до них не добраться).

Иными словами, нужно писать целый комбайн, чтобы предусмотреть все пограничные случаи.
 
Последнее редактирование:
Кстати, в моем случае непонятно к чему там все это прицеплено. Просто к настойкам файла?
 
К настройкам файла. Но система переноса метаданных такова, что при переносе любого слоя из родительского документа весь блок метаданных копируется и в целевой.

Метаданные путешествуют вместе со слоями на этапе верстки документа.
Вам либо нужно найти и "обезвредить" весь материал используемый для сборки макета (например, натравить тот же exiftool на каталог с рабочими файлами), либо приучиться копировать слои без использования перетаскивания из документа в документ.

П.с. все адово тормозит из-та такого количества метаданных

 
Последнее редактирование:
К настройкам файла. Но система переноса метаданных такова, что при переносе любого слоя из родительского документа весь блок метаданных копируется и в целевой.

Метаданные путешествуют вместе со слоями на этапе верстки документа.
Вам либо нужно найти и "обезвредить" весь материал используемый для сборки макета (например, натравить тот же exiftool на каталог с рабочими файлами), либо приучиться копировать слои без использования перетаскивания из документа в документ.

П.с. все адово тормозит из-та такого количества метаданных
Неа, при дублировании слоев в чистый новый файл ничего лишнего не перетащилось. Весь лишний груз остался в psd c чистобелым бэком.
 
Неа, при дублировании слоев в чистый новый файл ничего лишнего не перетащилось. Весь лишний груз остался в psd c чистобелым бэком.
На видео я перенес слой перетаскиванием между документами, все сохранилось. Попробуйте так.

В любом случае - просто обращайте внимание на метаданные.
 
По моим наблюдениям - все такие эти файлы из под мака. На сколько понял - это проблема совместимости шрифтов (или каких-то кодировок). В метаданные пропадают данные которые некорректно закодированы. И вместо одного символа туда попадает 10
 
  • Печаль
Реакции: ~RA~
Нет. Корни этих файлов в определенном сценарии работы (документ используется как шаблон и в него день за днем, месяц за месяцем, год за годом планомерно попадают слои из других документов). Человек может либо сам нагенерить такой "контент", либо получить документ с таким содержимым, после чего при неблагоприятных условиях растащить метаданные по своим файлам вместе со слоями.

Попробуйте сами:
1. Создайте новый пустой документ. Зайдите прямо в Фотошопе в его метаданные - чистенько.
2. Создайте еще один документ, сохраните на диск (обязательно, так как метки пишутся в момент сохранения).
3. После сохранения перетащите в документ из шага 1 (drag & drop) либо слой из сохраненного документа, либо сам файл на диске как смарт-объект

Зайдите в метаданные документа из шага 1 и увидите, что там появилась запись с идентификатором документа из шага 2.

Повторите шаги 2-3 с созданием нового документа пару раз (в метаданные документа из шага 1 каждый раз будет добавляться новая строка)

Если теперь вы сохраните документ 1, то он сам станет источником метаданных с той разницей, что попытка повторить с ним шаги 2-3 приведет уже к копированию не только его собственного идентификатора, но и всех строк с метаданными из ранее добавленных в него документов (даже если слои с ними были удалены).

В определенных обстоятельствах это может вылиться в те самые стопятсотмульонов строк идентификаторов.
 
Последнее редактирование:
На видео я перенес слой перетаскиванием между документами, все сохранилось. Попробуйте так.

В любом случае - просто обращайте внимание на метаданные.
В любом случае я обращаю внимание на размер файлов. Хотя, к счастью, в psd редко какой ... сдает макеты.
И зачем я буду перетаскивать слои, когда при дублировании вся гадость отваливается?