Я создаю приложение на Android с помощью C++ Builder, и мне нужно распечатать (не отображать на экране) уже созданное растровое изображение. Для распечатки я использую приложение Classic Bluetooth Basic, которое предлагает Embarcadero. Для преобразования я использую этот код:
#include "System.NetEncoding.hpp"
TMemoryStream *ms;
TStringStream *ss;
String s;
UnicodeString result;
ms = new TMemoryStream();
ss = new TStringStream();
bmpResult->SaveToStream(ms);
ms->Position = 0;
EncodeStream(ms, ss);
s = ss->DataString;
ms->Free();
ss->Free();
result = s;
return result;
Он возвращает мне строку base64, поэтому я могу передать ее в функцию вывода, но она напечатает всю строку, и мне нужно растровое изображение (изображение само по себе).
Как мне это сделать?
ОТРЕДАКТИРОВАНО:
Код, который я использую для взаимодействия с принтером:
TBytes ToSend;
if((FSocket == NULL) || (ItemIndex != ComboBoxPaired->ItemIndex)) {
if(ComboBoxPaired->ItemIndex > -1) {
TBluetoothDevice * LDevice = FPairedDevices->Items[ComboBoxPaired->ItemIndex];
FSocket = LDevice->CreateClientSocket(StringToGUID(ServiceGUI), false);
if(FSocket != NULL) {
ItemIndex = ComboBoxPaired->ItemIndex;
FSocket->Connect();
//func is AnsiString and passed as a parameter in this function
ToSend = TEncoding::UTF8->GetBytes(func);
FSocket->SendData(ToSend);
delete FSocket;
FSocket = NULL;
}
else {
ShowMessage("Error 1");
}
}
else {
ShowMessage("Error 2");
}
}
else {
ShowMessage("Error 4");
}
Я пытался использовать TEncoding
для кодирования растрового изображения и перехода к ToSend
, но я не смог найти и не имеет смысла, потому что он будет печатать строку (тот же случай, что и base64).
print out (not display on screen)
? у вас есть принтер и вы хотите распечатать результат на бумаге? если в VCL есть классTPrinter
, у которого есть собственный Canvas, вы можете (растянуть) нарисовать на нем растровое изображение. , если не уточнить, что вы имеете в виду... Если вы имеете в виду передачу изображения по base64, вам нужно декодировать его на другом конце (где вы его получаете) - person Spektre   schedule 25.11.2020FMX.Printer
для использования, но безуспешно. Я использую растровые изображения иScanline
для перемещения информации о моем растровом изображении вTBitmapSurface
(вопросы размера растрового изображения), и когда я помещаюprinter->Begindoc() (printer is an instance of FMX TPrinter)
иprinter->EndDoc()
, это дает мне ошибку сегментации. Много гуглил, а ответа нет. Документации тоже нет. - person Que44   schedule 25.11.2020TBitmap
в строку base64, чтобы передать ее на принтер? В этом нет никакого смысла. Какие входные данные на самом деле ожидает API принтера? Пожалуйста, отредактируйте свой вопрос, чтобы включить код, который вы используете для взаимодействия с принтером. - person Remy Lebeau   schedule 25.11.2020TPrinter
работает только для Windows и MacOS. Кроме того, если я что-либо закодирую с помощьюTEncoding
, в конце концов это будет в байтах или строке (например, base64). Я не смог найти класс или что-то, что я мог бы передавать растровые изображения непосредственно на принтер, я хочу отредактировать эту функцию для прямой передачи растровых изображений, но из-за преобразований я не могу. Я отредактировал свой вопрос при взаимодействии с моим принтером, он работает и печатает тексты String. Спасибо. - person Que44   schedule 25.11.2020TPrinter
намного проще, так как все это делается с помощью драйвера принтера, однако я не пишу код для Android и FMX, поэтому я не знаю, работает ли он на вашей платформе, и у вас просто есть ошибка в вашем коде или вам нужно использовать что-то еще - person Spektre   schedule 25.11.2020TPrinter
работает только на Windows и MacOS: TPrinter. Я понимаю, что вы сказали об Epson Printer, но мне нужно использовать его в некоторых принтерах, и я не использую ESC/POS в этом случае, чтобы иметь стандартный шаг, поэтому я буду печатать только что-то, например: String (что я уже делаю). Я буду гуглить больше об этом и попытаюсь найти какое-то решение. Спасибо. - person Que44   schedule 25.11.2020intent
непосредственно для Android, которые делают это для меня. Я нашел этот код на сайте Android, и если есть способ сделать это в C++ Builder, это может быть решением: Печать растрового изображения - person Que44   schedule 25.11.2020Free
для уничтожения объекта. Используйте ключевое словоdelete
, но вместоTMemoryStream* ms = new TMemoryStream(); ... delete ms;
вы можете использоватьstd::unique_ptr<TMemoryStream> ms;
, которое автоматически вызываетdelete
, когда оно выходит за рамки. - person Ted Lyngmo   schedule 27.11.2020