Сначала (я забыл сказать, что я новичок в java, и это мой первый пост здесь, поэтому, если я сделаю некоторые ошибки, PLS исправьте меня;)) У меня проблема, что у меня много изображений. Между этими изображениями находятся некоторые, которые повреждены (например, изображение с ICC-профилем CMYK и Lab имеет схему RGB пикселя или другой пример ICC: RGB и XYZ и CMYK пиксельной схемы). Мне нужно запрограммировать приложение Java для тестирования этих файлов для этой конкретной категории.Java extract colorSpace и PCS из ICC_Profile для проверки целостности изображения
FileTypes: JPG, TIFF, GIF, PNG и BMP.
Я установил уже ImageIO и ImageIO из twelvemonkeys для приема файлов CMYK. Я попытался зачитать данные Meta/exif, а также данные ICC, но он не показал мне необходимую мне информацию.
Я попытался зачитать данные с помощью PhotoMe, но для этого мне нужно искать все файлы по одному и сравнивать их вручную. Поэтому я знал, что данные находятся в файлах, а не пустые.
Таким образом, цель состоит в том, чтобы считывать метаданные и ICC-Profil и сравнивать конкретные значения.
Благодаря Zorian
Edit: я сумел получить Pixel-схему, я думаю, но я не могу Acces другой информации. Вот код для доступа к Pixel-Scheme (или ColorSpace). Так у тебя есть идея получить другие вещи?
int cst = 0;
ColorSpace cs= image.getColorModel().getColorSpace();
System.out.println("--> "+cs.getType());
cst = cs.getType();
PixelScheme pisc = new PixelScheme();
pisc.showPixelSchema(cst);
log.append("Pixel-Scheme = " + pisc.showPixelScheme(cst) + "\n");
//Class Pixel-Scheme
//the Case values taken from a table from java.awt.color.ColorSpace;
package components;
import java.awt.color.ColorSpace;
public class PixelSchema {
public String showPixelSchema (int cst)
{
switch (cst)
{
case 0: ptype = "XYZ";
break;
case 1: ptype = "Lab";
break;
case 2: ptype = "Luv";
break;
case 3: ptype = "YCbCr";
break;
case 4: ptype = "Yxy";
break;
case 5: ptype = "RGB";
break;
case 6: ptype = "GRAY";
break;
case 7: ptype = "HSV";
break;
case 8: ptype = "HLS";
break;
case 9: ptype = "CMYK";
break;
case 11: ptype = "CMY";
break;
case 12: ptype = "2CLR";
break;
case 13: ptype = "3CLR";
break;
case 14: ptype = "4CLR";
break;
case 15: ptype = "5CLR";
break;
case 16: ptype = "6CLR";
break;
case 17: ptype = "7CLR";
break;
case 18: ptype = "8CLR";
break;
case 19: ptype = "9CLR";
break;
case 20: ptype = "ACLR";
break;
case 21: ptype = "BCLR";
break;
case 22: ptype = "CCLR";
break;
case 23: ptype = "DCLR";
break;
case 24: ptype = "ECLR";
break;
case 25: ptype = "FCLR";
break;
case 1000: ptype = "sRGB";
break;
case 1001: ptype = "CIEXYZ";
break;
case 1002: ptype = "PYCC";
break;
case 1003: ptype = "GRAY";
break;
case 1004: ptype = "LINEAR_RGB";
break;
default: ptype = "ERROR!";
break;
}
return ptype;
}
}
Update: Я реализовал фрагмент кода, но получил еще ошибку в Netbeans, но как-то работать и показывать мне необходимые данные.
public void ICC(File file) throws IOException
{
//Error indicated cause of file (but I don't know an other way to import my image (tried to convert it to some kinds of arrays but it won't work))
Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(file));
ICCProfile icc_profile = (ICCProfile)metadataMap.get(MetadataType.ICC_PROFILE);
if(icc_profile != null) {
icc_profile.showMetadata();
log.append("PCS = ");
log.append("Color Space = ");
}
}
Но теперь мой вопрос: Есть ли возможность получить только эти две части данных [Цветовое пространство: CMYK + PCS: Lab] из заголовка и записать их в переменную? (Два в скобках) Мне это нужно, потому что я должен отображать результаты Color Space и PCS и сравнивать их с PixelScheme.
Update 2: я, наконец, получил все данные мне нужно, но все еще есть проблемы с Update 1! Вот мой фрагмент кода для этой ошибки!
public void ICC(File file) throws IOException
{
Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(file);
ICCProfile icc_profile = (ICCProfile)metadataMap.get(MetadataType.ICC_PROFILE);
if(icc_profile != null)
{
icc_profile.showMetadata();
String iccs = icc_profile.getReader().getColorSpace();
String icpcs = icc_profile.getReader().getPCS();
log.append("Color Space = " + iccs + "\n");
log.append("PCS = " + icpcs + "\n");
}
}
Update 3: обнаружена ошибка;) это было 1) слишком много
Спасибо большое за этой библиотеки!
Я не думаю, что есть один-к-одному между ICC_Profile COLORSPACE и те из PixelSchema плюс там могут быть некоторые преобразования COLORSPACE в процессе чтения изображений. Поэтому, когда дело доходит до BufferedImage, colorSpace может быть уже изменено. – dragon66
Я тестирую, если есть какая-то одна ошибка сопоставления, я пишу инструмент и проверяю свои результаты с помощью некоторых пикапов (для PhotoMe и других программ) для всех изображений, чтобы проверить его. – Zorian