Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Квадрат в квадрате или обман aztecgen / 11 сообщений из 11, страница 1 из 1
11.10.2017, 09:12:52
    #39534422
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
Уважаемые форумчане возник у меня вопрос и ищу я из него решение. Мне нужно сгенерировать 2d-код для последующего считывания сканером. Наткнулся на библиотеку aztecgen. Картинка формируется у меня следующим образом:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
function generateMatrixToimg(data: string, img: TImage): boolean;
var
 matrix: PAGMatrix;
 p: PAGByte;
 x,y: Cardinal;
 rec: TRect;
begin
 Result := False;
 if ag_generate(matrix, PChar(data), Length(Data), nil) = AG_SUCCESS then
 begin
  p := matrix^.data;
  img.Height := matrix^.Height;
  img.Width := matrix^.Width;
  img.canvas.brush.color := clBlack;
  for y := 1 to matrix^.height do
  begin
   for x := 1 to matrix^.width do
   begin
    if p^ <> 0 then
    begin
     rec.Left := x-1;
     rec.top := y-1;
     rec.right := x;
     rec.bottom := y;
     img.canvas.Fillrect(rec);
    end;

    img.refresh;
    img.repaint;
    Application.ProcessMessages;
    Inc(p);
   end;
  end;
  Result := True;
  ag_release_matrix(matrix);
 end;
end;



Код рисуется, но почему то всегда урезанный вдвое. Тут либо думать почему код рисуется неправильно, либо костыльным методом загонять в data двойную строку.
Если использовать двойную строку, хочется хотя бы обрезать лишнее, а для этого нужно вырезать внутренний квадрат из квадрата (см рис). С рисованием у меня тоже не ахти... Поэтому на повестке у меня 2 вопроса:
1) Что не так с функцией рисования?
2) Как вырезать внутрении квадратик и поместить его в TImage - расстояние до него со всех краев одинаковое и равно 1/4 ширины или высоты рисунка. Ширина и высота рисунка не кратна 2
...
Рейтинг: 0 / 0
11.10.2017, 09:19:16
    #39534425
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
1. Главным образом, использование TImage. Замени на TBitmap.
2. В соответствии с (1) вопрос нужно переформулировать
...
Рейтинг: 0 / 0
11.10.2017, 09:21:59
    #39534426
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
Соколинский Борис, ок сейчас попробуем
...
Рейтинг: 0 / 0
11.10.2017, 09:29:45
    #39534428
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
Соколинский Борис, не помогло

function generateMatrixToimg(data: string, img: TBitMap): boolean;
var
matrix: PAGMatrix;
p: PAGByte;
x,y: Cardinal;
rec: TRect;
begin
Result := False;
if ag_generate(matrix, PChar(data), Length(Data), nil) = AG_SUCCESS then
begin
p := matrix^.data;
img.Height := matrix^.Height;
img.Width := matrix^.Width;
img.canvas.brush.color := clBlack;
for y := 1 to matrix^.height do
begin
for x := 1 to matrix^.width do
begin
if p^ <> 0 then
begin
rec.Left := x-1;
rec.top := y-1;
rec.right := x;
rec.bottom := y;
img.canvas.Fillrect(rec);
end;

Inc(p);
end;
end;
Result := True;
ag_release_matrix(matrix);
end;
end;

// а ниже через кнопочку создание битмапа вызов функции и присвоение битмапа имеджу

Image.Picture.Bitmap.Assign(img)
...
Рейтинг: 0 / 0
11.10.2017, 10:13:40
    #39534457
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
Попробовал даже в тестовом проекте, все равно половину обрезает. Может подскажете по 2-му пути что можно сделать?
...
Рейтинг: 0 / 0
11.10.2017, 10:19:02
    #39534460
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
dartveider13Может подскажете по 2-му пути что можно сделать?
Дай угадаю: юникодная делфи?

dartveider13
Код: pascal
1.
function generateMatrixToimg(data: ansistring, img: TImage): boolean;
...
Рейтинг: 0 / 0
11.10.2017, 10:19:42
    #39534462
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
wadman, ну да. DelphiXE
...
Рейтинг: 0 / 0
11.10.2017, 10:20:08
    #39534463
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
dartveider13,

Какая версия Delphi? Если юникодная, то, сдаётся мне, в этой строке:
Код: pascal
1.
ag_generate(matrix, PChar(data), Length(Data), nil) = AG_SUCCESS

нужно использовать
Код: pascal
1.
Length(Data) * SizeOf(Char)

.
...
Рейтинг: 0 / 0
11.10.2017, 10:21:15
    #39534464
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
wadman,
[offtopic]Как в SRC выделять текст? :)[/offtopic]
...
Рейтинг: 0 / 0
11.10.2017, 10:23:02
    #39534466
dartveider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
wadmandartveider13Может подскажете по 2-му пути что можно сделать?
Дай угадаю: юникодная делфи?

dartveider13
Код: pascal
1.
function generateMatrixToimg(data: ansistring, img: TImage): boolean;



Ептить колотить. И правда Ваша. Так все отлично генерирует.)))) Вот сколько раз натыкаюсь уже на эти стринги... Надо читать матчасть.
Спасибо Вам огромное. Все удачно сформировалось.
...
Рейтинг: 0 / 0
11.10.2017, 10:27:13
    #39534470
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Квадрат в квадрате или обман aztecgen
alekcvpwadman,
[offtopic]Как в SRC выделять текст? :)[/offtopic]
http://www.sql.ru/faq/faq_topic.aspx?fid=202
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Квадрат в квадрате или обман aztecgen / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]