2015-02-11 2 views
1

Сначала (я забыл сказать, что я новичок в 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) слишком много

Спасибо большое за этой библиотеки!

+0

Я не думаю, что есть один-к-одному между ICC_Profile COLORSPACE и те из PixelSchema плюс там могут быть некоторые преобразования COLORSPACE в процессе чтения изображений. Поэтому, когда дело доходит до BufferedImage, colorSpace может быть уже изменено. – dragon66

+0

Я тестирую, если есть какая-то одна ошибка сопоставления, я пишу инструмент и проверяю свои результаты с помощью некоторых пикапов (для PhotoMe и других программ) для всех изображений, чтобы проверить его. – Zorian

ответ

2

Возможно, вы захотите попробовать this. Он поддерживает извлечение ICC_Profile из TIFF, JPEG, PNG. Ниже приводится некоторая информация от конкретного запуска:

*** Start of ICC_Profile Header *** 
Profile Size: 3144 
CMM Type: Lino 
Version: 2.10 
Profile/Device Class: 'mntr': display devices - CRTs and LCDs 
Color Space: RGB 
PCS: XYZ 
Date Created: 1998/2/9, 6:49:0 
Profile File Signature: acsp 
Primary Platform Signature: MSFT 
Flags: not embedded, used independently 
Device Manufacturer: IEC 
Device Model: sRGB 
Device Attributes: reflective, glossy, positive, color 
Rendering Intent: media-relative colorimetric 
PCS Illuminant: X = 0.9642029, Y = 1.0, Z = 0.8249054 
Profile Creator: HP 
Profile ID: [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00] 
*** End of ICC_Profile Header *** 
*** Start of ICC_Profile Tag Table *** 
Tag Count: 17 
Tag# 0, Tag Name: bTRC (blueTRCTag), Data Offset: 1084, Data Length: 2060 
Tag# 1, Tag Name: bXYZ (blueMatrixColumnTag), Data Offset: 576, Data Length: 20 
Tag# 2, Tag Name: BKPT (mediaBlackPointTag), Data Offset: 516, Data Length: 20 
Tag# 3, Tag Name: cprt (copyrightTag), Data Offset: 336, Data Length: 51 
Tag# 4, Tag Name: desc (profileDescriptionTag), Data Offset: 388, Data Length: 108 
Tag# 5, Tag Name: dmdd (deviceModelDescTag), Data Offset: 708, Data Length: 136 
Tag# 6, Tag Name: dmnd (deviceMfgDescTag), Data Offset: 596, Data Length: 112 
Tag# 7, Tag Name: gTRC (greenTRCTag), Data Offset: 1084, Data Length: 2060 
Tag# 8, Tag Name: gXYZ (greenMatrixColumnTag), Data Offset: 556, Data Length: 20 
Tag# 9, Tag Name: lumi (luminanceTag), Data Offset: 1016, Data Length: 20 
Tag# 10, Tag Name: meas (measurementTag), Data Offset: 1036, Data Length: 36 
Tag# 11, Tag Name: rTRC (redTRCTag), Data Offset: 1084, Data Length: 2060 
Tag# 12, Tag Name: rXYZ (redMatrixColumnTag), Data Offset: 536, Data Length: 20 
Tag# 13, Tag Name: tech (technologyTag), Data Offset: 1072, Data Length: 12 
Tag# 14, Tag Name: view (viewingConditionsTag), Data Offset: 980, Data Length: 36 
Tag# 15, Tag Name: vued (viewingCondDescTag), Data Offset: 844, Data Length: 134 
Tag# 16, Tag Name: wtpt (mediaWhitePointTag), Data Offset: 496, Data Length: 20 
*** End of ICC_Profile Tag Table *** 

Вот пример кода, чтобы начать с:

import java.io.IOException; 
    import java.util.Map; 

    import com.icafe4j.image.meta.Metadata; 
    import com.icafe4j.image.meta.MetadataType; 
    import com.icafe4j.image.meta.icc.ICCProfile; 

    public class ExtractICCProfile { 

     public static void main(String[] args) throws IOException { 
      Map<MetadataType, Metadata> metadataMap = Metadata.readMetadata(args[0]); 
      ICCProfile icc_profile = (ICCProfile)metadataMap.get(MetadataType.ICC_PROFILE); 

      if(icc_profile != null) { 
       icc_profile.showMetadata(); 
      } 
     } 
    } 

Grab "icafe.баночка "из„Lib“каталог по ссылке выше, и вы хорошо идти тест с образцом кода

Update:. ваш может показать только COLORSPACE и PCS как это:

if(icc_profile != null) 
{ 
    String colorSpace = icc_profile.getColorSpace(); 
    String pcs = icc_profile.getPCS(); 
} 

Update 2:.

Если вам необходимо прочитать дополнительные данные из определенного тега, вы можете захватить вкладку таблицу первым, а затем получить запись тегов вы заинтересованы в Вот отрывок:

public void readTag(ProfileTag tag) { 
     ProfileTagTable tagTable = reader.getTagTable(); 
     TagEntry tag = tagTable.getTagEntry(tag); 
     // Do your stuff with tag entry 
    } 

А вот вложенный класс TagEntry:

public static class TagEntry implements Comparable<TagEntry> { 
     private int profileTag; 
     private int dataOffset; 
     private int dataLength; 
     private byte[] data; 

     public TagEntry(int profileTag, int dataOffset, int dataLength, byte[] data) { 
      this.profileTag = profileTag; 
      this.dataOffset = dataOffset; 
      this.dataLength = dataLength; 
      this.data = data; 
     } 

     @Override 
     public int compareTo(TagEntry o) { 
      return (int)((this.profileTag&0xffffffffL) - (o.profileTag&0x0ffffffffL)); 
     } 

     public int getProfileTag() { 
      return profileTag; 
     } 

     public int getDataOffset() { 
      return dataOffset; 
     } 

     public int getDataLength() { 
      return dataLength; 
     } 

     public byte[] getData() { 
      return data; 
     }  
    } 
+0

Во-первых: Спасибо за icafe.jar Я попробую но из-за того, что я все еще изучаю java, трудно в нее попасть;) Я публикую свои результаты, как только получаю некоторую информацию. Я сделал обновление к своему первому сообщению, надеюсь, вы сможете дать мне подсказку. – Zorian

+0

Я нашел его -.- «bad error 1») ​​«слишком много ... да, я тоже нашел PCS и ColorSpace, после того, как я искал глубже в ur lib -> Мне жаль, что я не могу голосовать ua, но у меня нет репутация;) спасибо за помощь и приятный день – Zorian