Сообщений: 401
Тем: 51
Зарегистрирован: Jan 2013
Репутация:
1,447
Добрый вечер ЗГ, собственно пытался запихнуть картинки в Комюнити что бы заднего фона не было, тобишь PNG картинка была в клиенте прозрачной, но нечего так и не получилось, устал заморачиваться данной темой, если кто может запихните 6 картинок в клиент плиз, на пивко поделюсь!
http://rghost.ru/45165600 вот картинки.
Сообщений: 794
Тем: 31
Зарегистрирован: Dec 2012
Репутация:
2,838
Обратитесь к специалисту acmi - http://forum.zone-game.info/member.php?u=21628
acmi Написал:Исходное изображение неоч:
если устраивает
Тема же старая осталась, зачем новую создали...
Logo для комюнити Created by Sensation
Сообщений: 401
Тем: 51
Зарегистрирован: Jan 2013
Репутация:
1,447
Krasavella Написал:Обратитесь к специалисту acmi - http://forum.zone-game.info/member.php?u=21628
Тема же старая осталась, зачем новую создали...
Logo для комюнити Created by Sensation
в прошлый раз в плохом качестве картинку скидывал теперь в хорошем и теперь там не 1 картинка а 6
Сообщений: 2,444
Тем: 59
Зарегистрирован: May 2010
Репутация:
13,020
Давно такое видел, тоже интересно как реализовывается ( без добавления чего либо в клиент )
СЕО Оптимизация сайтов
Сообщений: 794
Тем: 31
Зарегистрирован: Dec 2012
Репутация:
2,838
Через UTX и больше никак.
Сообщений: 2,444
Тем: 59
Зарегистрирован: May 2010
Репутация:
13,020
Krasavella Написал:Через UTX и больше никак.
Смяшно, но неправда, есть ещё способ минимум 1 который я знаю
СЕО Оптимизация сайтов
Сообщений: 794
Тем: 31
Зарегистрирован: Dec 2012
Репутация:
2,838
Расскажите что это, без добавления чего либо в клиент, если не секрет?
P.S. Зачем изобретать велосипед, если можно просто добавить картинку 500кбайт в Апдейтер?
Сообщений: 2,444
Тем: 59
Зарегистрирован: May 2010
Репутация:
13,020
Krasavella Написал:Расскажите что это, без добавления чего либо в клиент, если не секрет?
P.S. Зачем изобретать велосипед, если можно просто добавить картинку 500кбайт в Апдейтер?
Нет апдейтера/люди не обновляются....
16-тиричный код
клановые значки - картинка, она добавляется на сервер, а не клиент, думайте, на форуме лыжи была тема
СЕО Оптимизация сайтов
Сообщений: 794
Тем: 31
Зарегистрирован: Dec 2012
Репутация:
2,838
gorodetskiy Написал:клановые значки - картинка, она добавляется на сервер, а не клиент, думайте, на форуме лыжи была тема
Алгоритм генерации капчи, не требует ни каких картинок встраивать в клиент , передается как клановый значек , работает безотказно:
Генерация DDS DXT1
package l2.gameserver.utils;
import l2.commons.util.Rnd;
/**
* Генератор капчи и обвязка на 4 символа в формате DDS DXT1 (16x64x2) для передачи как клановы значек.
* @author izen
*
*/
public class CapchaUtil
{
private static final String alphabet = "WJFZNYSGVRU57912";
private static final int crc24tab[] =
{
0x00000000, 0x00800063, 0x008000A5, 0x000000C6, 0x00800129, 0x0000014A, 0x0000018C, 0x008001EF,
0x00800231, 0x00000252, 0x00000294, 0x008002F7, 0x00000318, 0x0080037B, 0x008003BD, 0x000003DE,
0x00800401, 0x00000462, 0x000004A4, 0x008004C7, 0x00000528, 0x0080054B, 0x0080058D, 0x000005EE,
0x00000630, 0x00800653, 0x00800695, 0x000006F6, 0x00800719, 0x0000077A, 0x000007BC, 0x008007DF,
0x00800861, 0x00000802, 0x000008C4, 0x008008A7, 0x00000948, 0x0080092B, 0x008009ED, 0x0000098E,
0x00000A50, 0x00800A33, 0x00800AF5, 0x00000A96, 0x00800B79, 0x00000B1A, 0x00000BDC, 0x00800BBF,
0x00000C60, 0x00800C03, 0x00800CC5, 0x00000CA6, 0x00800D49, 0x00000D2A, 0x00000DEC, 0x00800D8F,
0x00800E51, 0x00000E32, 0x00000EF4, 0x00800E97, 0x00000F78, 0x00800F1B, 0x00800FDD, 0x00000FBE,
0x008010A1, 0x000010C2, 0x00001004, 0x00801067, 0x00001188, 0x008011EB, 0x0080112D, 0x0000114E,
0x00001290, 0x008012F3, 0x00801235, 0x00001256, 0x008013B9, 0x000013DA, 0x0000131C, 0x0080137F,
0x000014A0, 0x008014C3, 0x00801405, 0x00001466, 0x00801589, 0x000015EA, 0x0000152C, 0x0080154F,
0x00801691, 0x000016F2, 0x00001634, 0x00801657, 0x000017B8, 0x008017DB, 0x0080171D, 0x0000177E,
0x000018C0, 0x008018A3, 0x00801865, 0x00001806, 0x008019E9, 0x0000198A, 0x0000194C, 0x0080192F,
0x00801AF1, 0x00001A92, 0x00001A54, 0x00801A37, 0x00001BD8, 0x00801BBB, 0x00801B7D, 0x00001B1E,
0x00801CC1, 0x00001CA2, 0x00001C64, 0x00801C07, 0x00001DE8, 0x00801D8B, 0x00801D4D, 0x00001D2E,
0x00001EF0, 0x00801E93, 0x00801E55, 0x00001E36, 0x00801FD9, 0x00001FBA, 0x00001F7C, 0x00801F1F,
0x00802121, 0x00002142, 0x00002184, 0x008021E7, 0x00002008, 0x0080206B, 0x008020AD, 0x000020CE,
0x00002310, 0x00802373, 0x008023B5, 0x000023D6, 0x00802239, 0x0000225A, 0x0000229C, 0x008022FF,
0x00002520, 0x00802543, 0x00802585, 0x000025E6, 0x00802409, 0x0000246A, 0x000024AC, 0x008024CF,
0x00802711, 0x00002772, 0x000027B4, 0x008027D7, 0x00002638, 0x0080265B, 0x0080269D, 0x000026FE,
0x00002940, 0x00802923, 0x008029E5, 0x00002986, 0x00802869, 0x0000280A, 0x000028CC, 0x008028AF,
0x00802B71, 0x00002B12, 0x00002BD4, 0x00802BB7, 0x00002A58, 0x00802A3B, 0x00802AFD, 0x00002A9E,
0x00802D41, 0x00002D22, 0x00002DE4, 0x00802D87, 0x00002C68, 0x00802C0B, 0x00802CCD, 0x00002CAE,
0x00002F70, 0x00802F13, 0x00802FD5, 0x00002FB6, 0x00802E59, 0x00002E3A, 0x00002EFC, 0x00802E9F,
0x00003180, 0x008031E3, 0x00803125, 0x00003146, 0x008030A9, 0x000030CA, 0x0000300C, 0x0080306F,
0x008033B1, 0x000033D2, 0x00003314, 0x00803377, 0x00003298, 0x008032FB, 0x0080323D, 0x0000325E,
0x00803581, 0x000035E2, 0x00003524, 0x00803547, 0x000034A8, 0x008034CB, 0x0080340D, 0x0000346E,
0x000037B0, 0x008037D3, 0x00803715, 0x00003776, 0x00803699, 0x000036FA, 0x0000363C, 0x0080365F,
0x008039E1, 0x00003982, 0x00003944, 0x00803927, 0x000038C8, 0x008038AB, 0x0080386D, 0x0000380E,
0x00003BD0, 0x00803BB3, 0x00803B75, 0x00003B16, 0x00803AF9, 0x00003A9A, 0x00003A5C, 0x00803A3F,
0x00003DE0, 0x00803D83, 0x00803D45, 0x00003D26, 0x00803CC9, 0x00003CAA, 0x00003C6C, 0x00803C0F,
0x00803FD1, 0x00003FB2, 0x00003F74, 0x00803F17, 0x00003EF8, 0x00803E9B, 0x00803E5D, 0x00003E3E,
};
private static final long[][][] glyphs =
{
// System
{
{
// 0: 'W'
0x0000000000000C60L,
0x0C600C600D600D60L,
0x0D6006C006C006C0L,
0x0000000000000000L
},
{
// 1: 'J'
0x0000000000000060L,
0x0060006000600060L,
0x00600660066003C0L,
0x0000000000000000L
},
{
// 2: 'F'
0x00000000000007E0L,
0x06000600060007C0L,
0x0600060006000600L,
0x0000000000000000L
},
{
// 3: 'Z'
0x00000000000007E0L,
0x0060006000C00180L,
0x03000600060007E0L,
0x0000000000000000L
},
{
// 4: 'N'
0x0000000000000630L,
0x0630073007B006F0L,
0x0670063006300630L,
0x0000000000000000L
},
{
// 5: 'Y'
0x0000000000000660L,
0x06600660066003C0L,
0x0180018001800180L,
0x0000000000000000L
},
{
// 6: 'S'
0x00000000000003C0L,
0x0660060003000180L,
0x00C00060066003C0L,
0x0000000000000000L
},
{
// 7: 'G'
0x00000000000003C0L,
0x0660066006000600L,
0x06E00660066003E0L,
0x0000000000000000L
},
{
// 8: 'V'
0x0000000000000660L,
0x0660066006600660L,
0x0660066003C00180L,
0x0000000000000000L
},
{
// 9: 'R'
0x00000000000007C0L,
0x06600660066007C0L,
0x06C0066006600660L,
0x0000000000000000L
},
{
// 10: 'U'
0x0000000000000660L,
0x0660066006600660L,
0x06600660066003C0L,
0x0000000000000000L
},
{
// 11: '5'
0x00000000000007E0L,
0x06000600060007C0L,
0x0060006000C00780L,
0x0000000000000000L
},
{
// 12: '7'
0x00000000000007E0L,
0x006000C000C00180L,
0x0180030003000300L,
0x0000000000000000L
},
{
// 13: '9'
0x00000000000003C0L,
0x0660066006600660L,
0x03E000C001800380L,
0x0000000000000000L
},
{
// 14: '1'
0x00000000000000C0L,
0x01C007C000C000C0L,
0x00C000C000C000C0L,
0x0000000000000000L
},
{
// 15: '2'
0x00000000000003C0L,
0x06600660006000C0L,
0x01800300060007E0L,
0x0000000000000000L
},
},
// Tahoma
{
{
// 0: 'W'
0x0000000061866186L,
0x618663C633CC33CCL,
0x366C366C1C381C38L,
0x1C38000000000000L
},
{
// 1: 'J'
0x0000000003F00030L,
0x0030003000300030L,
0x0030003000300060L,
0x07C0000000000000L
},
{
// 2: 'F'
0x0000000007F80600L,
0x06000600060007F8L,
0x0600060006000600L,
0x0600000000000000L
},
{
// 3: 'Z'
0x000000000FF00030L,
0x006000C000C00180L,
0x0300030006000C00L,
0x0FF0000000000000L
},
{
// 4: 'N'
0x0000000018041C04L,
0x1E041704138411C4L,
0x10E41074103C101CL,
0x100C000000000000L
},
{
// 5: 'Y'
0x0000000018181818L,
0x0C300C30066003C0L,
0x03C0018001800180L,
0x0180000000000000L
},
{
// 6: 'S'
0x0000000003F00618L,
0x0C180C000F8007F0L,
0x007800180C180C30L,
0x07E0000000000000L
},
{
// 7: 'G'
0x0000000003F00E18L,
0x0C181800180018F8L,
0x181818180C180E18L,
0x03F0000000000000L
},
{
// 8: 'V'
0x0000000018301830L,
0x18300C600C600C60L,
0x06C006C006C00380L,
0x0380000000000000L
},
{
// 9: 'R'
0x000000000FE00C30L,
0x0C300C300C300C60L,
0x0FC00C600C300C18L,
0x0C0C000000000000L
},
{
// 10: 'U'
0x0000000018181818L,
0x1818181818181818L,
0x1818181818180C30L,
0x07E0000000000000L
},
{
// 11: '5'
0x0000000007F80600L,
0x0600060007E00030L,
0x001800180C180C30L,
0x07E0000000000000L
},
{
// 12: '7'
0x000000000FF80030L,
0x00300060006000C0L,
0x00C0018001800300L,
0x0300000000000000L
},
{
// 13: '9'
0x0000000003E00630L,
0x0C180C180C180618L,
0x03F8001800300060L,
0x07C0000000000000L
},
{
// 14: '1'
0x0000000001800780L,
0x0180018001800180L,
0x0180018001800180L,
0x07E0000000000000L
},
{
// 15: '2'
0x0000000007E00C30L,
0x0C18001800180030L,
0x006001C003000600L,
0x0FF8000000000000L
},
},
// Verdana
{
{
// 0: 'W'
0x000000000000318CL,
0x318C318C19981BD8L,
0x1A580E700C300C30L,
0x0000000000000000L
},
{
// 1: 'J'
0x00000000000003E0L,
0x0060006000600060L,
0x00600060006007C0L,
0x0000000000000000L
},
{
// 2: 'F'
0x00000000000007E0L,
0x06000600060007C0L,
0x0600060006000600L,
0x0000000000000000L
},
{
// 3: 'Z'
0x00000000000007E0L,
0x00C000C001800180L,
0x03000300060007E0L,
0x0000000000000000L
},
{
// 4: 'N'
0x0000000000000C10L,
0x0E100B100B100990L,
0x08D008D008700830L,
0x0000000000000000L
},
{
// 5: 'Y'
0x0000000000000C30L,
0x0C30066003C00180L,
0x0180018001800180L,
0x0000000000000000L
},
{
// 6: 'S'
0x00000000000007C0L,
0x0C200C000E0007C0L,
0x00E00060086007C0L,
0x0000000000000000L
},
{
// 7: 'G'
0x00000000000003E0L,
0x06100C000C000C00L,
0x0CF00C30063003F0L,
0x0000000000000000L
},
{
// 8: 'V'
0x0000000000000C60L,
0x0C600C6006C006C0L,
0x06C0038003800380L,
0x0000000000000000L
},
{
// 9: 'R'
0x0000000000000FC0L,
0x0C600C600C600FC0L,
0x0D800CC00C600C30L,
0x0000000000000000L
},
{
// 10: 'U'
0x0000000000000C30L,
0x0C300C300C300C30L,
0x0C300C300C3007E0L,
0x0000000000000000L
},
{
// 11: '5'
0x00000000000007E0L,
0x0600060007C00060L,
0x006000600C6007C0L,
0x0000000000000000L
},
{
// 12: '7'
0x00000000000007F0L,
0x00300060006000C0L,
0x00C0018001800300L,
0x0000000000000000L
},
{
// 13: '9'
0x00000000000007C0L,
0x0C600C600C600C60L,
0x07E0006000C00780L,
0x0000000000000000L
},
{
// 14: '1'
0x0000000000000180L,
0x0780018001800180L,
0x01800180018007E0L,
0x0000000000000000L
},
{
// 15: '2'
0x00000000000003E0L,
0x0630003000300060L,
0x00C00180030007F0L,
0x0000000000000000L
},
},
// LucidaI
{
{
// 0: 'W'
0x0000000000000808L,
0x0808099009B00B20L,
0x1340154015801980L,
0x1100000000000000L
},
{
// 1: 'J'
0x00000000000001E0L,
0x0020002000400040L,
0x0040008000800100L,
0x1E00000000000000L
},
{
// 2: 'F'
0x00000000000003FCL,
0x0200020004000400L,
0x07E0080008000800L,
0x1000000000000000L
},
{
// 3: 'Z'
0x00000000000003FCL,
0x0008001000200040L,
0x0080030004000800L,
0x1FE0000000000000L
},
{
// 4: 'N'
0x0000000000000308L,
0x0308030805100490L,
0x049008A008A008A0L,
0x1040000000000000L
},
{
// 5: 'Y'
0x0000000000000810L,
0x0820084004800500L,
0x0600040004000400L,
0x0800000000000000L
},
{
// 6: 'S'
0x00000000000001F0L,
0x0210020003000180L,
0x00C0004000400840L,
0x0F80000000000000L
},
{
// 7: 'G'
0x00000000000000F8L,
0x0308040008000800L,
0x0870102018200C20L,
0x07C0000000000000L
},
{
// 8: 'V'
0x0000000000000808L,
0x0810081004200440L,
0x0480058005000600L,
0x0400000000000000L
},
{
// 9: 'R'
0x00000000000001F0L,
0x0118010802100220L,
0x03C0048004400460L,
0x0820000000000000L
},
{
// 10: 'U'
0x0000000000000208L,
0x0208020804100410L,
0x0410082008200840L,
0x0780000000000000L
},
{
// 11: '5'
0x0000000000F80100L,
0x0100010003800040L,
0x0040004000400080L,
0x0F00000000000000L
},
{
// 12: '7'
0x0000000003F80010L,
0x0020004000800100L,
0x0200040004000800L,
0x1000000000000000L
},
{
// 13: '9'
0x0000000000F00118L,
0x0218021004100630L,
0x03E0002000400880L,
0x0F00000000000000L
},
{
// 14: '1'
0x00000010003001E0L,
0x0020002000400040L,
0x0040008000800080L,
0x0FE0000000000000L
},
{
// 15: '2'
0x0000000000F00108L,
0x0008000800100020L,
0x0040018002000400L,
0x0FC0000000000000L
},
},
};
public static final int buildCapcha(short text, byte font)
{
return (text | (font << 0x10)) & 0x00FFFFFF;
}
public static final short getCapchaTextPart(int capcha)
{
return (short)(capcha & 0x0000FFFF);
}
public static final byte getCapchaFontPart(int capcha)
{
return (byte)(capcha >> 0x10 & 0xFF);
}
public static final short rgb888TOrgb565(int rgb888)
{
return (short)((((rgb888 >> 0x08) & 0x00F808) |
((rgb888 >> 0x05) & 0x0007E0) |
((rgb888 >> 0x03) & 0x00001F)) & 0xFFFF);
}
public static final String getCapchaText(int capcha)
{
char[] r = new char[0x4];
short text = getCapchaTextPart(capcha);
for(int i = 0; i < 0x04; i++)
r[i] = alphabet.charAt(text >> (i << 2) & 0x0F);
return new String®;
}
/**
* Генерирует DDS DXT1 текстуру 16x64x2 c 4мя символами.
* @param text - 16 бит (слово) капча. каждые 4 бита - символ. итого доступно 16 символов.
* @param font - 8 бит. по 2 бита на каждый символ. доступно 4 набора шрифтов.
* @param bgcolor - цвет фона в RGB888 формате.
* @return массив из 640 байт - DDS DXT1 текстура с 4мя символами.
*/
public static final byte[] getCapchaImage(int capcha, int bgcolor)
{
byte[] r = new byte[0x280];
short text = getCapchaTextPart(capcha);
byte font = getCapchaFontPart(capcha);
int i, j, k;
long m = 0;
short bgc = rgb888TOrgb565(bgcolor);
short c = (short) ~bgc;
// header
r[0x00] = 0x44; r[0x01] = 0x44; r[0x02] = 0x53; r[0x03] = 0x20;// 'DDS ' signature
r[0x04] = 0x7C; // dwSize
r[0x08] = 0x07; r[0x09] = 0x10; r[0x0A] = 0x08; // dwFlags
r[0x0C] = 0x10; r[0x10] = 0x40; // dwHeight x dwWidth; 16 x 64
r[0x15] = 0x02; // dwPOLS
r[0x4C] = 0x20; // dwPFSize
r[0x50] = 0x04; // dwPFFlags; FourCC
r[0x54] = 0x44; r[0x55] = 0x58; r[0x56] = 0x54; r[0x57] = 0x31; // FourCC - 'DXT1'
// main map
for(i = 0; i < 0x04; i++)
for(j = 0; j < 0x04; j++)
{
m = glyphs[font >> (j << 1) & 0x03][text >> (j << 2) & 0x0F][i];
k = 0x80 + (j << 0x05) + (i << 0x07);
r[k + 0x00] = (byte)(bgc & 0xFF);
r[k + 0x01] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x02] = (byte)(c & 0xFF);
r[k + 0x03] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x04] = (byte)((m >> 0x3F & 0x01) | (m >> 0x3C & 0x04) | (m >> 0x39 & 0x10) | (m >> 0x36 & 0x40));
r[k + 0x05] = (byte)((m >> 0x2F & 0x01) | (m >> 0x2C & 0x04) | (m >> 0x29 & 0x10) | (m >> 0x26 & 0x40));
r[k + 0x06] = (byte)((m >> 0x1F & 0x01) | (m >> 0x1C & 0x04) | (m >> 0x19 & 0x10) | (m >> 0x16 & 0x40));
r[k + 0x07] = (byte)((m >> 0x0F & 0x01) | (m >> 0x0C & 0x04) | (m >> 0x09 & 0x10) | (m >> 0x06 & 0x40));
r[k + 0x08] = (byte)(bgc & 0xFF);
r[k + 0x09] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x0A] = (byte)(c & 0xFF);
r[k + 0x0B] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x0C] = (byte)((m >> 0x3B & 0x01) | (m >> 0x38 & 0x04) | (m >> 0x35 & 0x10) | (m >> 0x32 & 0x40));
r[k + 0x0D] = (byte)((m >> 0x2B & 0x01) | (m >> 0x28 & 0x04) | (m >> 0x25 & 0x10) | (m >> 0x22 & 0x40));
r[k + 0x0E] = (byte)((m >> 0x1B & 0x01) | (m >> 0x18 & 0x04) | (m >> 0x15 & 0x10) | (m >> 0x12 & 0x40));
r[k + 0x0F] = (byte)((m >> 0x0B & 0x01) | (m >> 0x08 & 0x04) | (m >> 0x05 & 0x10) | (m >> 0x02 & 0x40));
r[k + 0x10] = (byte)(bgc & 0xFF);
r[k + 0x11] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x12] = (byte)(c & 0xFF);
r[k + 0x13] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x14] = (byte)((m >> 0x37 & 0x01) | (m >> 0x34 & 0x04) | (m >> 0x31 & 0x10) | (m >> 0x2E & 0x40));
r[k + 0x15] = (byte)((m >> 0x27 & 0x01) | (m >> 0x24 & 0x04) | (m >> 0x21 & 0x10) | (m >> 0x1E & 0x40));
r[k + 0x16] = (byte)((m >> 0x17 & 0x01) | (m >> 0x14 & 0x04) | (m >> 0x11 & 0x10) | (m >> 0x0E & 0x40));
r[k + 0x17] = (byte)((m >> 0x07 & 0x01) | (m >> 0x04 & 0x04) | (m >> 0x01 & 0x10) | (m << 0x02 & 0x40));
r[k + 0x18] = (byte)(bgc & 0xFF);
r[k + 0x19] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x1A] = (byte)(c & 0xFF);
r[k + 0x1B] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x1C] = (byte)((m >> 0x33 & 0x01) | (m >> 0x30 & 0x04) | (m >> 0x2D & 0x10) | (m >> 0x2A & 0x40));
r[k + 0x1D] = (byte)((m >> 0x23 & 0x01) | (m >> 0x20 & 0x04) | (m >> 0x1D & 0x10) | (m >> 0x1A & 0x40));
r[k + 0x1E] = (byte)((m >> 0x13 & 0x01) | (m >> 0x10 & 0x04) | (m >> 0x0D & 0x10) | (m >> 0x0A & 0x40));
r[k + 0x1F] = (byte)((m >> 0x03 & 0x01) | (m >> 0x00 & 0x04) | (m << 0x03 & 0x10) | (m << 0x06 & 0x40));
}
return r;
}
/**
* Генерирует ID капчи для crest_id
* @param capcha
* @param font
* @return
*/
public static final int getId(int capcha)
{
short text = getCapchaTextPart(capcha);
byte font = getCapchaFontPart(capcha);
int r = 0x0b704ce;
r = (r << 8) ^ crc24tab[((r >>> 16) ^ (text >> 0x08 & 0xFF)) & 0xFF];
r = (r << 8) ^ crc24tab[((r >>> 16) ^ (text & 0xFF)) & 0xFF];
r = (r << 8) ^ crc24tab[((r >>> 16) ^ font) & 0xFF];
return r & 0x00FFFFFF;
}
public static final int RndCapcha()
{
return buildCapcha((short)Rnd.get(0x0000FFFF), (byte)Rnd.get(0xFF));
}
public static final int RndRGB888Color()
{
int r = Rnd.get(0xFF);
int g = Rnd.get(0xFF);
int b = Rnd.get(0xFF);
if(r >= 0x7A && r <= 0x86 && g >= 0x7A && g <= 0x86 && b >= 0x7A && b <= 0x86)
{ r = 0; g = 0; b = 0; }
return 0x00FFFFFF & (r << 0x10 & 0x00FF0000) | (g << 0x8 & 0x00FF00) | (b & 0xFF);
}
public static final boolean IsValidEntry(int capcha, String entry)
{
return entry.trim().toUpperCase().equalsIgnoreCase(getCap chaText(capcha));
}
}
Сообщений: 2,444
Тем: 59
Зарегистрирован: May 2010
Репутация:
13,020
Krasavella Написал:Алгоритм генерации капчи, не требует ни каких картинок встраивать в клиент , передается как клановый значек , работает безотказно:
Генерация DDS DXT1
package l2.gameserver.utils;
import l2.commons.util.Rnd;
/**
* Генератор капчи и обвязка на 4 символа в формате DDS DXT1 (16x64x2) для передачи как клановы значек.
* @author izen
*
*/
public class CapchaUtil
{
private static final String alphabet = "WJFZNYSGVRU57912";
private static final int crc24tab[] =
{
0x00000000, 0x00800063, 0x008000A5, 0x000000C6, 0x00800129, 0x0000014A, 0x0000018C, 0x008001EF,
0x00800231, 0x00000252, 0x00000294, 0x008002F7, 0x00000318, 0x0080037B, 0x008003BD, 0x000003DE,
0x00800401, 0x00000462, 0x000004A4, 0x008004C7, 0x00000528, 0x0080054B, 0x0080058D, 0x000005EE,
0x00000630, 0x00800653, 0x00800695, 0x000006F6, 0x00800719, 0x0000077A, 0x000007BC, 0x008007DF,
0x00800861, 0x00000802, 0x000008C4, 0x008008A7, 0x00000948, 0x0080092B, 0x008009ED, 0x0000098E,
0x00000A50, 0x00800A33, 0x00800AF5, 0x00000A96, 0x00800B79, 0x00000B1A, 0x00000BDC, 0x00800BBF,
0x00000C60, 0x00800C03, 0x00800CC5, 0x00000CA6, 0x00800D49, 0x00000D2A, 0x00000DEC, 0x00800D8F,
0x00800E51, 0x00000E32, 0x00000EF4, 0x00800E97, 0x00000F78, 0x00800F1B, 0x00800FDD, 0x00000FBE,
0x008010A1, 0x000010C2, 0x00001004, 0x00801067, 0x00001188, 0x008011EB, 0x0080112D, 0x0000114E,
0x00001290, 0x008012F3, 0x00801235, 0x00001256, 0x008013B9, 0x000013DA, 0x0000131C, 0x0080137F,
0x000014A0, 0x008014C3, 0x00801405, 0x00001466, 0x00801589, 0x000015EA, 0x0000152C, 0x0080154F,
0x00801691, 0x000016F2, 0x00001634, 0x00801657, 0x000017B8, 0x008017DB, 0x0080171D, 0x0000177E,
0x000018C0, 0x008018A3, 0x00801865, 0x00001806, 0x008019E9, 0x0000198A, 0x0000194C, 0x0080192F,
0x00801AF1, 0x00001A92, 0x00001A54, 0x00801A37, 0x00001BD8, 0x00801BBB, 0x00801B7D, 0x00001B1E,
0x00801CC1, 0x00001CA2, 0x00001C64, 0x00801C07, 0x00001DE8, 0x00801D8B, 0x00801D4D, 0x00001D2E,
0x00001EF0, 0x00801E93, 0x00801E55, 0x00001E36, 0x00801FD9, 0x00001FBA, 0x00001F7C, 0x00801F1F,
0x00802121, 0x00002142, 0x00002184, 0x008021E7, 0x00002008, 0x0080206B, 0x008020AD, 0x000020CE,
0x00002310, 0x00802373, 0x008023B5, 0x000023D6, 0x00802239, 0x0000225A, 0x0000229C, 0x008022FF,
0x00002520, 0x00802543, 0x00802585, 0x000025E6, 0x00802409, 0x0000246A, 0x000024AC, 0x008024CF,
0x00802711, 0x00002772, 0x000027B4, 0x008027D7, 0x00002638, 0x0080265B, 0x0080269D, 0x000026FE,
0x00002940, 0x00802923, 0x008029E5, 0x00002986, 0x00802869, 0x0000280A, 0x000028CC, 0x008028AF,
0x00802B71, 0x00002B12, 0x00002BD4, 0x00802BB7, 0x00002A58, 0x00802A3B, 0x00802AFD, 0x00002A9E,
0x00802D41, 0x00002D22, 0x00002DE4, 0x00802D87, 0x00002C68, 0x00802C0B, 0x00802CCD, 0x00002CAE,
0x00002F70, 0x00802F13, 0x00802FD5, 0x00002FB6, 0x00802E59, 0x00002E3A, 0x00002EFC, 0x00802E9F,
0x00003180, 0x008031E3, 0x00803125, 0x00003146, 0x008030A9, 0x000030CA, 0x0000300C, 0x0080306F,
0x008033B1, 0x000033D2, 0x00003314, 0x00803377, 0x00003298, 0x008032FB, 0x0080323D, 0x0000325E,
0x00803581, 0x000035E2, 0x00003524, 0x00803547, 0x000034A8, 0x008034CB, 0x0080340D, 0x0000346E,
0x000037B0, 0x008037D3, 0x00803715, 0x00003776, 0x00803699, 0x000036FA, 0x0000363C, 0x0080365F,
0x008039E1, 0x00003982, 0x00003944, 0x00803927, 0x000038C8, 0x008038AB, 0x0080386D, 0x0000380E,
0x00003BD0, 0x00803BB3, 0x00803B75, 0x00003B16, 0x00803AF9, 0x00003A9A, 0x00003A5C, 0x00803A3F,
0x00003DE0, 0x00803D83, 0x00803D45, 0x00003D26, 0x00803CC9, 0x00003CAA, 0x00003C6C, 0x00803C0F,
0x00803FD1, 0x00003FB2, 0x00003F74, 0x00803F17, 0x00003EF8, 0x00803E9B, 0x00803E5D, 0x00003E3E,
};
private static final long[][][] glyphs =
{
// System
{
{
// 0: 'W'
0x0000000000000C60L,
0x0C600C600D600D60L,
0x0D6006C006C006C0L,
0x0000000000000000L
},
{
// 1: 'J'
0x0000000000000060L,
0x0060006000600060L,
0x00600660066003C0L,
0x0000000000000000L
},
{
// 2: 'F'
0x00000000000007E0L,
0x06000600060007C0L,
0x0600060006000600L,
0x0000000000000000L
},
{
// 3: 'Z'
0x00000000000007E0L,
0x0060006000C00180L,
0x03000600060007E0L,
0x0000000000000000L
},
{
// 4: 'N'
0x0000000000000630L,
0x0630073007B006F0L,
0x0670063006300630L,
0x0000000000000000L
},
{
// 5: 'Y'
0x0000000000000660L,
0x06600660066003C0L,
0x0180018001800180L,
0x0000000000000000L
},
{
// 6: 'S'
0x00000000000003C0L,
0x0660060003000180L,
0x00C00060066003C0L,
0x0000000000000000L
},
{
// 7: 'G'
0x00000000000003C0L,
0x0660066006000600L,
0x06E00660066003E0L,
0x0000000000000000L
},
{
// 8: 'V'
0x0000000000000660L,
0x0660066006600660L,
0x0660066003C00180L,
0x0000000000000000L
},
{
// 9: 'R'
0x00000000000007C0L,
0x06600660066007C0L,
0x06C0066006600660L,
0x0000000000000000L
},
{
// 10: 'U'
0x0000000000000660L,
0x0660066006600660L,
0x06600660066003C0L,
0x0000000000000000L
},
{
// 11: '5'
0x00000000000007E0L,
0x06000600060007C0L,
0x0060006000C00780L,
0x0000000000000000L
},
{
// 12: '7'
0x00000000000007E0L,
0x006000C000C00180L,
0x0180030003000300L,
0x0000000000000000L
},
{
// 13: '9'
0x00000000000003C0L,
0x0660066006600660L,
0x03E000C001800380L,
0x0000000000000000L
},
{
// 14: '1'
0x00000000000000C0L,
0x01C007C000C000C0L,
0x00C000C000C000C0L,
0x0000000000000000L
},
{
// 15: '2'
0x00000000000003C0L,
0x06600660006000C0L,
0x01800300060007E0L,
0x0000000000000000L
},
},
// Tahoma
{
{
// 0: 'W'
0x0000000061866186L,
0x618663C633CC33CCL,
0x366C366C1C381C38L,
0x1C38000000000000L
},
{
// 1: 'J'
0x0000000003F00030L,
0x0030003000300030L,
0x0030003000300060L,
0x07C0000000000000L
},
{
// 2: 'F'
0x0000000007F80600L,
0x06000600060007F8L,
0x0600060006000600L,
0x0600000000000000L
},
{
// 3: 'Z'
0x000000000FF00030L,
0x006000C000C00180L,
0x0300030006000C00L,
0x0FF0000000000000L
},
{
// 4: 'N'
0x0000000018041C04L,
0x1E041704138411C4L,
0x10E41074103C101CL,
0x100C000000000000L
},
{
// 5: 'Y'
0x0000000018181818L,
0x0C300C30066003C0L,
0x03C0018001800180L,
0x0180000000000000L
},
{
// 6: 'S'
0x0000000003F00618L,
0x0C180C000F8007F0L,
0x007800180C180C30L,
0x07E0000000000000L
},
{
// 7: 'G'
0x0000000003F00E18L,
0x0C181800180018F8L,
0x181818180C180E18L,
0x03F0000000000000L
},
{
// 8: 'V'
0x0000000018301830L,
0x18300C600C600C60L,
0x06C006C006C00380L,
0x0380000000000000L
},
{
// 9: 'R'
0x000000000FE00C30L,
0x0C300C300C300C60L,
0x0FC00C600C300C18L,
0x0C0C000000000000L
},
{
// 10: 'U'
0x0000000018181818L,
0x1818181818181818L,
0x1818181818180C30L,
0x07E0000000000000L
},
{
// 11: '5'
0x0000000007F80600L,
0x0600060007E00030L,
0x001800180C180C30L,
0x07E0000000000000L
},
{
// 12: '7'
0x000000000FF80030L,
0x00300060006000C0L,
0x00C0018001800300L,
0x0300000000000000L
},
{
// 13: '9'
0x0000000003E00630L,
0x0C180C180C180618L,
0x03F8001800300060L,
0x07C0000000000000L
},
{
// 14: '1'
0x0000000001800780L,
0x0180018001800180L,
0x0180018001800180L,
0x07E0000000000000L
},
{
// 15: '2'
0x0000000007E00C30L,
0x0C18001800180030L,
0x006001C003000600L,
0x0FF8000000000000L
},
},
// Verdana
{
{
// 0: 'W'
0x000000000000318CL,
0x318C318C19981BD8L,
0x1A580E700C300C30L,
0x0000000000000000L
},
{
// 1: 'J'
0x00000000000003E0L,
0x0060006000600060L,
0x00600060006007C0L,
0x0000000000000000L
},
{
// 2: 'F'
0x00000000000007E0L,
0x06000600060007C0L,
0x0600060006000600L,
0x0000000000000000L
},
{
// 3: 'Z'
0x00000000000007E0L,
0x00C000C001800180L,
0x03000300060007E0L,
0x0000000000000000L
},
{
// 4: 'N'
0x0000000000000C10L,
0x0E100B100B100990L,
0x08D008D008700830L,
0x0000000000000000L
},
{
// 5: 'Y'
0x0000000000000C30L,
0x0C30066003C00180L,
0x0180018001800180L,
0x0000000000000000L
},
{
// 6: 'S'
0x00000000000007C0L,
0x0C200C000E0007C0L,
0x00E00060086007C0L,
0x0000000000000000L
},
{
// 7: 'G'
0x00000000000003E0L,
0x06100C000C000C00L,
0x0CF00C30063003F0L,
0x0000000000000000L
},
{
// 8: 'V'
0x0000000000000C60L,
0x0C600C6006C006C0L,
0x06C0038003800380L,
0x0000000000000000L
},
{
// 9: 'R'
0x0000000000000FC0L,
0x0C600C600C600FC0L,
0x0D800CC00C600C30L,
0x0000000000000000L
},
{
// 10: 'U'
0x0000000000000C30L,
0x0C300C300C300C30L,
0x0C300C300C3007E0L,
0x0000000000000000L
},
{
// 11: '5'
0x00000000000007E0L,
0x0600060007C00060L,
0x006000600C6007C0L,
0x0000000000000000L
},
{
// 12: '7'
0x00000000000007F0L,
0x00300060006000C0L,
0x00C0018001800300L,
0x0000000000000000L
},
{
// 13: '9'
0x00000000000007C0L,
0x0C600C600C600C60L,
0x07E0006000C00780L,
0x0000000000000000L
},
{
// 14: '1'
0x0000000000000180L,
0x0780018001800180L,
0x01800180018007E0L,
0x0000000000000000L
},
{
// 15: '2'
0x00000000000003E0L,
0x0630003000300060L,
0x00C00180030007F0L,
0x0000000000000000L
},
},
// LucidaI
{
{
// 0: 'W'
0x0000000000000808L,
0x0808099009B00B20L,
0x1340154015801980L,
0x1100000000000000L
},
{
// 1: 'J'
0x00000000000001E0L,
0x0020002000400040L,
0x0040008000800100L,
0x1E00000000000000L
},
{
// 2: 'F'
0x00000000000003FCL,
0x0200020004000400L,
0x07E0080008000800L,
0x1000000000000000L
},
{
// 3: 'Z'
0x00000000000003FCL,
0x0008001000200040L,
0x0080030004000800L,
0x1FE0000000000000L
},
{
// 4: 'N'
0x0000000000000308L,
0x0308030805100490L,
0x049008A008A008A0L,
0x1040000000000000L
},
{
// 5: 'Y'
0x0000000000000810L,
0x0820084004800500L,
0x0600040004000400L,
0x0800000000000000L
},
{
// 6: 'S'
0x00000000000001F0L,
0x0210020003000180L,
0x00C0004000400840L,
0x0F80000000000000L
},
{
// 7: 'G'
0x00000000000000F8L,
0x0308040008000800L,
0x0870102018200C20L,
0x07C0000000000000L
},
{
// 8: 'V'
0x0000000000000808L,
0x0810081004200440L,
0x0480058005000600L,
0x0400000000000000L
},
{
// 9: 'R'
0x00000000000001F0L,
0x0118010802100220L,
0x03C0048004400460L,
0x0820000000000000L
},
{
// 10: 'U'
0x0000000000000208L,
0x0208020804100410L,
0x0410082008200840L,
0x0780000000000000L
},
{
// 11: '5'
0x0000000000F80100L,
0x0100010003800040L,
0x0040004000400080L,
0x0F00000000000000L
},
{
// 12: '7'
0x0000000003F80010L,
0x0020004000800100L,
0x0200040004000800L,
0x1000000000000000L
},
{
// 13: '9'
0x0000000000F00118L,
0x0218021004100630L,
0x03E0002000400880L,
0x0F00000000000000L
},
{
// 14: '1'
0x00000010003001E0L,
0x0020002000400040L,
0x0040008000800080L,
0x0FE0000000000000L
},
{
// 15: '2'
0x0000000000F00108L,
0x0008000800100020L,
0x0040018002000400L,
0x0FC0000000000000L
},
},
};
public static final int buildCapcha(short text, byte font)
{
return (text | (font << 0x10)) & 0x00FFFFFF;
}
public static final short getCapchaTextPart(int capcha)
{
return (short)(capcha & 0x0000FFFF);
}
public static final byte getCapchaFontPart(int capcha)
{
return (byte)(capcha >> 0x10 & 0xFF);
}
public static final short rgb888TOrgb565(int rgb888)
{
return (short)((((rgb888 >> 0x08) & 0x00F808) |
((rgb888 >> 0x05) & 0x0007E0) |
((rgb888 >> 0x03) & 0x00001F)) & 0xFFFF);
}
public static final String getCapchaText(int capcha)
{
char[] r = new char[0x4];
short text = getCapchaTextPart(capcha);
for(int i = 0; i < 0x04; i++)
r[i] = alphabet.charAt(text >> (i << 2) & 0x0F);
return new String®;
}
/**
* Генерирует DDS DXT1 текстуру 16x64x2 c 4мя символами.
* @param text - 16 бит (слово) капча. каждые 4 бита - символ. итого доступно 16 символов.
* @param font - 8 бит. по 2 бита на каждый символ. доступно 4 набора шрифтов.
* @param bgcolor - цвет фона в RGB888 формате.
* @return массив из 640 байт - DDS DXT1 текстура с 4мя символами.
*/
public static final byte[] getCapchaImage(int capcha, int bgcolor)
{
byte[] r = new byte[0x280];
short text = getCapchaTextPart(capcha);
byte font = getCapchaFontPart(capcha);
int i, j, k;
long m = 0;
short bgc = rgb888TOrgb565(bgcolor);
short c = (short) ~bgc;
// header
r[0x00] = 0x44; r[0x01] = 0x44; r[0x02] = 0x53; r[0x03] = 0x20;// 'DDS ' signature
r[0x04] = 0x7C; // dwSize
r[0x08] = 0x07; r[0x09] = 0x10; r[0x0A] = 0x08; // dwFlags
r[0x0C] = 0x10; r[0x10] = 0x40; // dwHeight x dwWidth; 16 x 64
r[0x15] = 0x02; // dwPOLS
r[0x4C] = 0x20; // dwPFSize
r[0x50] = 0x04; // dwPFFlags; FourCC
r[0x54] = 0x44; r[0x55] = 0x58; r[0x56] = 0x54; r[0x57] = 0x31; // FourCC - 'DXT1'
// main map
for(i = 0; i < 0x04; i++)
for(j = 0; j < 0x04; j++)
{
m = glyphs[font >> (j << 1) & 0x03][text >> (j << 2) & 0x0F][i];
k = 0x80 + (j << 0x05) + (i << 0x07);
r[k + 0x00] = (byte)(bgc & 0xFF);
r[k + 0x01] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x02] = (byte)(c & 0xFF);
r[k + 0x03] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x04] = (byte)((m >> 0x3F & 0x01) | (m >> 0x3C & 0x04) | (m >> 0x39 & 0x10) | (m >> 0x36 & 0x40));
r[k + 0x05] = (byte)((m >> 0x2F & 0x01) | (m >> 0x2C & 0x04) | (m >> 0x29 & 0x10) | (m >> 0x26 & 0x40));
r[k + 0x06] = (byte)((m >> 0x1F & 0x01) | (m >> 0x1C & 0x04) | (m >> 0x19 & 0x10) | (m >> 0x16 & 0x40));
r[k + 0x07] = (byte)((m >> 0x0F & 0x01) | (m >> 0x0C & 0x04) | (m >> 0x09 & 0x10) | (m >> 0x06 & 0x40));
r[k + 0x08] = (byte)(bgc & 0xFF);
r[k + 0x09] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x0A] = (byte)(c & 0xFF);
r[k + 0x0B] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x0C] = (byte)((m >> 0x3B & 0x01) | (m >> 0x38 & 0x04) | (m >> 0x35 & 0x10) | (m >> 0x32 & 0x40));
r[k + 0x0D] = (byte)((m >> 0x2B & 0x01) | (m >> 0x28 & 0x04) | (m >> 0x25 & 0x10) | (m >> 0x22 & 0x40));
r[k + 0x0E] = (byte)((m >> 0x1B & 0x01) | (m >> 0x18 & 0x04) | (m >> 0x15 & 0x10) | (m >> 0x12 & 0x40));
r[k + 0x0F] = (byte)((m >> 0x0B & 0x01) | (m >> 0x08 & 0x04) | (m >> 0x05 & 0x10) | (m >> 0x02 & 0x40));
r[k + 0x10] = (byte)(bgc & 0xFF);
r[k + 0x11] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x12] = (byte)(c & 0xFF);
r[k + 0x13] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x14] = (byte)((m >> 0x37 & 0x01) | (m >> 0x34 & 0x04) | (m >> 0x31 & 0x10) | (m >> 0x2E & 0x40));
r[k + 0x15] = (byte)((m >> 0x27 & 0x01) | (m >> 0x24 & 0x04) | (m >> 0x21 & 0x10) | (m >> 0x1E & 0x40));
r[k + 0x16] = (byte)((m >> 0x17 & 0x01) | (m >> 0x14 & 0x04) | (m >> 0x11 & 0x10) | (m >> 0x0E & 0x40));
r[k + 0x17] = (byte)((m >> 0x07 & 0x01) | (m >> 0x04 & 0x04) | (m >> 0x01 & 0x10) | (m << 0x02 & 0x40));
r[k + 0x18] = (byte)(bgc & 0xFF);
r[k + 0x19] = (byte)(bgc >> 0x08 & 0xFF);
r[k + 0x1A] = (byte)(c & 0xFF);
r[k + 0x1B] = (byte)(c >> 0x08 & 0xFF);
r[k + 0x1C] = (byte)((m >> 0x33 & 0x01) | (m >> 0x30 & 0x04) | (m >> 0x2D & 0x10) | (m >> 0x2A & 0x40));
r[k + 0x1D] = (byte)((m >> 0x23 & 0x01) | (m >> 0x20 & 0x04) | (m >> 0x1D & 0x10) | (m >> 0x1A & 0x40));
r[k + 0x1E] = (byte)((m >> 0x13 & 0x01) | (m >> 0x10 & 0x04) | (m >> 0x0D & 0x10) | (m >> 0x0A & 0x40));
r[k + 0x1F] = (byte)((m >> 0x03 & 0x01) | (m >> 0x00 & 0x04) | (m << 0x03 & 0x10) | (m << 0x06 & 0x40));
}
return r;
}
/**
* Генерирует ID капчи для crest_id
* @param capcha
* @param font
* @return
*/
public static final int getId(int capcha)
{
short text = getCapchaTextPart(capcha);
byte font = getCapchaFontPart(capcha);
int r = 0x0b704ce;
r = (r << 8) ^ crc24tab[((r >>> 16) ^ (text >> 0x08 & 0xFF)) & 0xFF];
r = (r << 8) ^ crc24tab[((r >>> 16) ^ (text & 0xFF)) & 0xFF];
r = (r << 8) ^ crc24tab[((r >>> 16) ^ font) & 0xFF];
return r & 0x00FFFFFF;
}
public static final int RndCapcha()
{
return buildCapcha((short)Rnd.get(0x0000FFFF), (byte)Rnd.get(0xFF));
}
public static final int RndRGB888Color()
{
int r = Rnd.get(0xFF);
int g = Rnd.get(0xFF);
int b = Rnd.get(0xFF);
if(r >= 0x7A && r <= 0x86 && g >= 0x7A && g <= 0x86 && b >= 0x7A && b <= 0x86)
{ r = 0; g = 0; b = 0; }
return 0x00FFFFFF & (r << 0x10 & 0x00FF0000) | (g << 0x8 & 0x00FF00) | (b & 0xFF);
}
public static final boolean IsValidEntry(int capcha, String entry)
{
return entry.trim().toUpperCase().equalsIgnoreCase(getCap chaText(capcha));
}
}
Вот видите, а говорили что обязательно добавлять в клиент картинку
СЕО Оптимизация сайтов
|