2015-08-04 2 views
0

Я генерирую изображение captcha с помощью jcaptcha-all-1.0-RC6.Как установить стиль шрифта для текста в Captcha, сгенерированном jCaptcha

фрагмент кода для того же ниже

  captchaService = new DefaultManageableImageCaptchaService(); 
      logger.info(" After creating instance getCaptcha "); 
      long id = System.currentTimeMillis(); 
      String captchaId = String.valueOf(id); 

      logger.info(" getCaptcha Id " + captchaId); 

      logger.info("***********Coming into captcha service***************************************************"); 
      BufferedImage challenge = captchaService 
         .getImageChallengeForID(captchaId); 
      WritableRaster raster = challenge.getRaster(); 
     ColorModel model = challenge.getColorModel(); 
      challenge.setRGB(0,25,51); 

      logger.debug("challenge:" + challenge); 
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

      ImageIO.write(challenge, "jpeg", outputStream); 

      outputStream.close(); 
      outputStream.flush(); 
      byte[] res = outputStream.toByteArray(); 

      String encodedImage = Base64.encodeBase64String(res); 

Однако качество изображения, которое я получаю не высокого качества. Есть ли что-то, что мы можем сделать, чтобы получить лучшее качество изображения с лучшей читабельностью.

Даже изменение стиля шрифта может быть полезным. Любая помощь по этому вопросу также будет полезна

ответ

3

Чтобы изменить изображение с помощью конфигурации, вы должны расширить ListImageCaptchaEngine и использовать генератор:

  • Слово генератор
  • Color Generator
  • фона Генератор
  • Font Generator

    public class MyImageCaptchaEngine extends ListImageCaptchaEngine { 
    
    @Override 
    protected void buildInitialFactories() { 
    
        WordGenerator wgen = new RandomWordGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"); 
        RandomRangeColorGenerator cgen = new RandomRangeColorGenerator(new int[] { 0, 255 }, new int[] { 20, 100 }, new int[] { 20, 100 }); 
    
        TextPaster textPaster = new RandomTextPaster(new Integer(4), new Integer(5), cgen, Boolean.TRUE); 
    
        BackgroundGenerator backgroundGenerator = new UniColorBackgroundGenerator(new Integer(240), new Integer(50), new Color(252,252,253)); 
    
    
        Font[] fontsList = new Font[] { new Font("Helvetica", Font.TYPE1_FONT, 10), new Font("Arial", 0, 14), new Font("Vardana", 0, 17), }; 
    
        FontGenerator fontGenerator = new RandomFontGenerator(new Integer(18), new Integer(30), fontsList); 
        WordToImage wordToImage = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster); 
         this.addFactory(new GimpyFactory(wgen, wordToImage)); 
        } 
    } 
    

И использовать его

ImageCaptchaService instance = new DefaultManageableImageCaptchaService(
      new FastHashMapCaptchaStore(), 
      new MyImageCaptchaEngine(), 
      180, 
      100000, 
      75000); 
+0

Можете ли вы мне помочь, как объявить backgroundGenerator, textPaster, wgen, который указан в вашем коде. –

+0

Я использовал ваш код. Однако теперь я получаю ошибку, так как слово слишком высокое: попробуйте использовать меньшее количество букв, меньший шрифт или больший фон. Пожалуйста, помогите на этом –

+1

@ParthaBisoi просто поиграть с настройками, то есть размер изображения, размер шрифта и т. Д. И посмотреть, что будет работать для вас. Вы могли бы сделать буквы меньше, но тогда они могут быть недоступны для чтения, вы можете сделать изображение больше, что может не соответствовать вашему дизайну ui, вы можете использовать более короткие слова, которые могут противоречить вашим требованиям безопасности и т. Д. - вам решать, которые работают для вас. – Thomas

1

Посмотрите на DefaultGimpyEngine о том, как продлить ListImageCaptchaEngine и предоставить такие параметры, как цвет фона, размер изображения, шрифты и т. Д. (Вы можете скопировать и предоставить свои собственные значения).

Стиль шрифта AFAIK на самом деле отличается от шрифта той же семьи (скажем, «Arial bold» и «Arial regular» - это 2 стиля семейства Arial). Таким образом, вы можете выбрать только нужные шрифты (убедитесь, что они доступны в системе).

+0

Это поможет, если вы можете объяснить с примером кода. –

+0

@ParthaBisoi взгляните на источник, с которым я связан. Возможно, вы захотите углубиться в код и документацию, чтобы понять, что там происходит. Объяснение всего, что было бы недоступно для SO. – Thomas

Смежные вопросы