powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Размеры картинки при сохранении
11 сообщений из 11, страница 1 из 1
Размеры картинки при сохранении
    #40134103
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Была задача- сгенерировать Qr-код и сохранить его в виде картинки в Ecxel.

C QR-кодом проблемы нет, отрисовывается нормально.

Но вот при вставке в Ecxel размеры всегда 29 на 29.
Думала что-то при вставке не так. Но при сохранении в bmp такая же история.
Я уже пробовала и размеры PaintBox менять, и самой области, где пиксели отрисовываются, и scale... ничего не помогает.
Может есть какие-то другие настройки при импорте картинке, а которые я упускаю?

Код: 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.
procedure TForm1.Button1Click(Sender: TObject);
var
  QRCode: TDelphiZXingQRCode;
  Row, Column: Integer;
  Brush: TStrokeBrush;
begin
  QRCode := TDelphiZXingQRCode.Create;
  try
    QRCode.Data := edtText.Text;
    QRCode.Encoding := TQRCodeEncoding(cmbEncoding.ItemIndex);
    QRCode.QuietZone := StrToIntDef(edtQuietZone.Text, 4);
    QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
    for Row := 0 to QRCode.Rows - 1 do
    begin
      for Column := 0 to QRCode.Columns - 1 do
      begin
       if (QRCode.IsBlack[Row, Column]) then
        begin
           drawPixel(QRCodeBitmap, Column, Row, TAlphaColors.Black);
        end else
        begin
        drawPixel(QRCodeBitmap, Column, Row, TAlphaColors.White);
        end;
      end;
    end;
  finally
    QRCode.Free;
  end;
  PaintBox1.Repaint;
end;



Код: 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.
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
  Scale: Double;
  h, w: integer;
begin
  PaintBox1.Canvas.Fill.Color := TAlphaColorRec.White;
  PaintBox1.Canvas.FillRect(RectF(0, 0, PaintBox1.Width, PaintBox1.Height), 0, 0, AllCorners, 1);
  if ((QRCodeBitmap.Width > 0) and (QRCodeBitmap.Height > 0)) then
  begin
    if (PaintBox1.Width < PaintBox1.Height) then
    begin
      Scale := PaintBox1.Width / QRCodeBitmap.Width;
    end else
    begin
      Scale := PaintBox1.Height / QRCodeBitmap.Height;
    end;
    h:=Trunc(QRCodeBitmap.Height* Scale);
    w:=Trunc(QRCodeBitmap.Width * Scale);
  with Canvas do
  begin
    BeginScene();
    PaintBox1.Canvas.DrawBitmap(QRCodeBitmap, Rect(0, 0, w, h), Rect(0, 0, w, h), 1, true);
    EndScene;
  end;
  end;
end;




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.drawPixel(bitmap : TBitmap; x, y : integer; color : TAlphaColor);
var vBitMapData  : TBitmapData;
begin
  if bitmap.Map(TMapAccess.maWrite, vBitMapData) then
    begin
    try
       vBitmapData.SetPixel(x, y, color);
    finally
       bitmap.Unmap(vBitMapData);
    end;
    end;
end;




//Excel
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.Button2Click(Sender: TObject);
var
  E: OleVariant;
  VClipboard: IFMXClipboardService;
begin
  E:=CreateOleObject('Excel.Application');
  E.WorkBooks.Add;
  E.Visible:=true;
  E.ActiveWorkbook.Sheets.Item['Лист1'].Select;
  E.ActiveWorkbook.ActiveSheet.Cells[1,1].select;
  if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, VClipboard) then begin
    VClipboard.SetClipboard(QRCodeBitmap);
  end;
  E.ActiveSheet.Paste;
end;
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134109
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья
Была задача- сгенерировать Qr-код и сохранить его в виде картинки в Ecxel.


Вы для каждого элемента QR рисуете 1 пиксел, т.к. размеры кода у Вас 29х29, получается то, что получается.
Введите параметр - размер элемента QR ширина*высота, в соотвествии с этим параметром создавайте bitmap (помня про белую окантовку), затем на этом bitmap рисуйте эти элементы/прямоугольники нужно цвета.

Другой выриант - использовать StretchDraw, но не рекомендуется
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134129
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
  Scale: Double;
  h, w: integer;
begin
  PaintBox1.Canvas.Fill.Color := TAlphaColorRec.White;
  PaintBox1.Canvas.FillRect(RectF(0, 0, PaintBox1.Width, PaintBox1.Height), 0, 0, AllCorners, 1);
  if ((QRCodeBitmap.Width > 0) and (QRCodeBitmap.Height > 0)) then
  begin
    if (PaintBox1.Width < PaintBox1.Height) then
    begin
      Scale := PaintBox1.Width / QRCodeBitmap.Width;
    end else
    begin
      Scale := PaintBox1.Height / QRCodeBitmap.Height;
    end;
    PaintBox1.Canvas.StretchDraw(Rect(0, 0, Trunc(Scale * QRCodeBitmap.Width), Trunc(Scale * QRCodeBitmap.Height)), QRCodeBitmap); //<--
  end;
end;



...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134156
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064, не совсем поняла, что размеры кода 29 на 29.

StretcDraw - не получится, так как это FMX. обрисовываю через TCanvas.BedinScene и TCanvas.EndScene.
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134175
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья
x1ca4064, не совсем поняла, что размеры кода 29 на 29.


TDelphiZXingQRCode возвращает размер сгенерированного QR в свойствах Rows и Columns, для тех данных и настроек, которые Вы емы передаете, он возвращает 29*29.

Вы создаете битмап этого размера.
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134214
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,
так, откуда 29 разобралась.
Но теперь другой вопрос, как его изменить?

QRCode.Rows:= понятное дело не катит.
Просмотрела ZXingQRCode - не могу понять, где устаивается размер, Вернее как правильно изменить
очевидно, где-то тут

Код: pascal
1.
2.
 FElements := GenerateQRCode(FData, Ord(FEncoding));
 FRows := Length(FElements) + FQuietZone * 2;
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134215
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья
x1ca4064,
так, откуда 29 разобралась.
Но теперь другой вопрос, как его изменить?

QRCode.Rows:= понятное дело не катит.
Просмотрела ZXingQRCode - не могу понять, где устаивается размер, Вернее как правильно изменить
очевидно, где-то тут

Код: pascal
1.
2.
 FElements := GenerateQRCode(FData, Ord(FEncoding));
 FRows := Length(FElements) + FQuietZone * 2;

имхо, тут программист нужен ©
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134359
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья
x1ca4064,
так, откуда 29 разобралась.
Но теперь другой вопрос, как его изменить?


Не нужно менять - создайте битмап нужного Вам размера (обычно, используют кратные размеру QR: [n*Rows,n*Columns]) и для каждого элемента QR рисуйте квадрат размера n*n.
Этакий упрощенный StretchDraw получится.
Сейчас сделано для случая n=1.

Вынесите все это в отдельную функцию (еще лучше, в отдельный модуль), должно получиться что-то такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
  TQRParams=packed record
    Version:byte;
    DotSize:byte;
    ErrCorLevel:byte;
    Alignment:byte;
  end;

function QRToBmp(const AQR:string;const AQRParams:TQRParams;ABitmap:TBitmap):boolean;
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134365
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня так отлично работала печать QR на чеке.
Если не ошибаюсь, тут RcCur - текущие координаты, где начинать рисовать,
nWindth - длина чека.
Через эти параметры масштаб рассчитывается и делается StretchDraw.
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
  procedure AddQRCode( const SText: AnsiString );
  var
    QRCodeBitmap: Graphics.TBitmap;
    QRCode: TDelphiZXingQRCode;
    Row, Column: Integer;

    nBitmapSize: Integer;
    Scale: Double;
    Rc: TRect;
  begin
    QRCodeBitmap := Graphics.TBitmap.Create;
    try
      QRCode := TDelphiZXingQRCode.Create;
      try
        QRCode.Data := WideString( SText );
        QRCode.Encoding := qrAuto;
        QRCode.QuietZone := 0;

        QRCodeBitmap.Width := QRCode.Columns;
        QRCodeBitmap.Height := QRCode.Rows;

        for Row := 0 to QRCode.Rows - 1 do begin
          for Column := 0 to QRCode.Columns - 1 do begin
            if (QRCode.IsBlack[Row, Column]) then
              QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack
            else
              QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
          end;
        end;

        nBitmapSize := Round( nWindth * 33 / 100 );
        if nBitmapSize > 0 then begin
          Scale := nBitmapSize / QRCodeBitmap.Width;

          Rc.Left := RcCur.Left;
          Rc.Top := RcCur.Top + 5;
          Rc.Right := Trunc( Scale * QRCodeBitmap.Width );
          Rc.Bottom := Rc.Top + Trunc( Scale * QRCodeBitmap.Height );

          Canvas.StretchDraw( Rc, QRCodeBitmap );
        end;
      finally
        QRCode.Free;
      end;
    finally
      QRCodeBitmap.Free;
    end;
  end;
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134391
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,
спасибо, но к сожалению в FMX нет StretchDraw.

разобралась, как сделать.
...
Рейтинг: 0 / 0
Размеры картинки при сохранении
    #40134393
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,
спасибо, сделала почти так.
Создаю битмапа нужного размера, очищаю до белого, размер битмапа делю на 29,
получаю Scale = размер бирмапа/29, отрисовываю только черные пиксели с поправкой на Scale.

В любом случае спасибо =)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Размеры картинки при сохранении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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