65.9K
CodeProject 正在变化。 阅读更多。
Home

访问 Android™ 移动设备上的医疗记录

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年8月21日

CPOL

6分钟阅读

viewsIcon

21397

这类新硬件的出现为医生和医疗专业人员随时随地访问患者数据创造了机会。本白皮书将重点介绍 AIMTools SDK、Barcode Xpress Mobile SDK 以及在 Android 移动设备上访问医疗记录。

新的 Android 移动设备正在快速上市。这类新硬件的出现为医生和医疗专业人员随时随地访问患者数据创造了机会。他们不必再前往自助服务亭或携带笨重的打印件或超大号笔记本电脑,而是可以使用手机或平板电脑设备访问患者数据。Windows SDK 的领导者 Accusoft Pegasus 已进入移动领域,推出了令人兴奋的新产品,让医疗专业人员能够移动访问各种医疗数据。本白皮书将重点介绍最近发布的两个产品以及如何使用它们来访问 Android 设备上的医疗记录:AIMToolsBarcode Xpress Mobile。

用例:患者医疗记录

患者使用带条形码的手环已是司空见惯,原因显而易见:即使患者无法自行识别,也能提供准确的身份信息。这提高了患者安全性,并大大降低了因用药剂量错误(或更糟,误操作)而导致的医疗差错的风险。《新英格兰医学杂志》最近在一篇题为“条形码技术对用药安全性的影响”的文章中记录了一项研究。研究结果证实,使用条形码技术进行患者用药剂量和给药可显著减少错误。

许多机构使用 Code 128 等一维条形码对患者手环进行编码。Code 128 是一种字母数字符号,非常适合对患者 ID 或姓名等信息进行编码。还可以使用常见的激光扫描仪轻松准确地读取它。

使用一维条形码的医疗手环

首先,我们将展示一个手环上仅包含患者 ID 的一维条形码,该条形码使用 Code 128 符号进行编码。

这是患者手臂上的手环

Mobile-Medical-Records/image001.jpg

这是 Android 版 Barcode Xpress 读取条形码并显示患者 ID 的情况

Mobile-Medical-Records/image002.jpg

使用解码后的数据

一旦条形码被解码,数据(“A32581239”)就可以被其他程序使用。例如,假设此患者 ID 是患者记录的索引,该记录包含医院服务器上的图像。我们可以使用 Barcode Xpress for Android 读取的条形码的索引来检索这些图像。检索后,可以在移动设备上显示这些图像。

代码

Android 应用程序通过一个称为 Activity 的事件驱动接口与硬件进行交互。Activity 模型提供了执行操作的回调。Barcode Xpress Mobile 提供的 Activity 公开了一些供您使用的回调;其中一个称为 onBarcodeRecognition。在扫描过程中识别条形码时会触发此回调。

让我们看看如何使用此回调来检索文件。在实际实现中,会有安全注意事项、加密等——此代码片段仅旨在演示系统的基本功能。

public void onBarcodeRecognition(Bundle msgBundle)
{
   // Set the state to show a successful decoding happened.
   scanState = R.id.display_results;
 
   // Extract the decoding results from the message bundle
   BXResult result = msgBundle.getParcelable("Result");
 
   // The Patient ID is encoded in the barcode
   String patientId = result.getDataString();
                     
   // Use the data to get the file
   try {
       URL url = new URL("http://www.YOUR_SITE.com/?=" + patientId + ".jpg");
       URLConnection urlConn = url.openConnection();
       InputStream is = urlConn.getInputStream();
       BufferedInputStream bis = new BufferedInputStream(is);
       ByteArrayBuffer bab = new ByteArrayBuffer(1024);
       int data = 0;
       while ((data = bis.read()) != -1) {
              bab.append((byte) data);
       }
       FileOutputStream fos = new FileOutputStream("/sdcard/" + patientId + ".jpg");
       fos.write(bab.toByteArray());
       fos.close();
                           
   } catch (MalformedURLException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }

在 Android 上查看医疗图像

现在您的应用程序已通过条形码获取了患者 ID,并检索了与该 ID 相关的图像,您需要一种方法来查看这些图像。医疗成像中使用的许多无损图像格式,包括 8 至 16 位灰度 JPEG 2000 和无损 JPEG,Android 操作系统本身并不支持。为了交互式地查看和处理这些图像,需要将其转换为有损支持格式,如 JPEG。

也就是说,直到现在。

Accusoft Pegasus AIMTools SDK 允许开发人员编写应用程序,无需转换或与服务器进行往返通信即可处理原始图像数据。这意味着原生的 Android 应用程序可以与所有原始图像数据进行交互,同时解压缩和转换应用程序用户重要的图像部分。窗口级别调整、缩放和其他常见操作可以在本地执行;无需回调到服务器。这大大提高了应用程序的响应速度,并极大地改善了用户体验。

Android 团队的 TouchExampleView 多点触控示例是我们显示患者记录中返回图像所需的查看器的基础。查看器使用的示例代码可在此处从 Android 获取

理解多点触控

为了在我们的应用程序中查看医疗图像,我们需要通过 JNI 调用 AIMTools 本机库来获取原始图像数据的 Bitmap。getBitmapNative JNI 方法启动对 AIMTools 本机库的调用。如前所述,AIMTools 能够裁剪、调整大小和调整窗口级别(亮度和对比度)的原始图像数据。这些设置包含在 ConvertParams 结构中。实现如下

/*
 * Get a bitmap of an image (native function).
 */
JNIEXPORT jobject JNICALL Java_com_accusoft_viewer_AIMImage_getBitmapNative (JNIEnv* env,
                                                                  jobject image,
                                                                  jobject convertParams)
{
  jobject bitmap = NULL;
  AIM_IMAGE *pAimImage;
 
  /* Try to get AIM_IMAGE pointer from Java class field. */
  pAimImage = getAimImageNative(env, image);
  if (pAimImage != NULL) {
     AIM_BITMAP *pAimBitmap;
     AIM_IMAGE_CONVERT_PARAMS *pConvertParams = NULL;
     bool ok = true;
 
     /* Convert convert params to native. */
     if (convertParams != NULL) {
        pConvertParams = extractAimImageConvertParamsNative(env, convertParams);
        if (pConvertParams == NULL) {
           ok = false;
        }
     }
 
     if (ok) {
        /* Get native bitmap. */
        ok = AIMImageGetBitmap(pAimImage, &pAimBitmap, pConvertParams);
        if (ok) {
          bitmap = createAimBitmap(env, pAimBitmap);
          if (bitmap == NULL) {
             AIMBitmapDestroy(pAimBitmap);
          }
        }
        if (pConvertParams != NULL) {
            free(pConvertParams);
        }
     }
   } else {
        LOGD("AIMImage.getBitmapNative(): Could not get AIM_IMAGE from AIMImage.\n");
   }
 
   return (bitmap);
}

AIMImageGetBitmap 是一个 C 函数,它直接调用本机 AIMTools 库以返回位图

/*
 * Get a bitmap of an image.
 *
 * Returns true if bitmap was created.
 * The output bitmap '*ppBitmap' MUST be destroyed by the caller.
 * If image is a container, this function will return false.
 */

 
bool AIMImageGetBitmap (AIM_IMAGE  *pImage,    /* Pointer to image. */
                        AIM_BITMAP **ppBitmap, /* Pointer to output bitmap. */
                        const AIM_IMAGE_CONVERT_PARAMS  *pConvertParams)  /* Pointer to structure describing image conversion parameters (resize, crop, brightness, contrast). */
{
    bool ok = false;
 
    if ((pImage != NULL) && (ppBitmap != NULL)) {
       /* Provide default values for output parameters. */
       *ppBitmap = NULL;
 
       if (pImage->SubImageQuantity == 0u) {
          void       *pOutputBuffer = NULL;
          size_t      outputLength = 0u;
          AIM_BITMAP *pBitmap = NULL;
          bool        convertOK = true;
          RGBQUAD     colorTbl[272];
 
          if (pConvertParams != NULL) {
             if ((pConvertParams->Brightness < AIM_IMAGE_BRIGHTNESS_MIN) ||  
                 (pConvertParams->Brightness > AIM_IMAGE_BRIGHTNESS_MAX)) {
                    convertOK = false;
             }
             if ((pConvertParams->Contrast < AIM_IMAGE_CONTRAST_MIN) || 
                 (pConvertParams->Contrast > AIM_IMAGE_CONTRAST_MAX)) {
                    convertOK = false;
             }
          }
          if (convertOK) {
             bool   bitmapOK;
             REGION region;
 
             bitmapOK = pImage->pExpander->GetBitmapFunc( pImage,
                         &pOutputBuffer, &outputLength, &region,
                         colorTbl, pConvertParams);
 
             if (bitmapOK) {
               pBitmap = AIMBitmapCreateFromDataDirect(pOutputBuffer, 
                                     outputLength, &region);
               if (pBitmap == NULL) {
                  AIM_DEBUG(("Error: AIMImageGetBitmap(): Error creating bitmap.\n"));
                  free(pOutputBuffer);
               } else {
                  ok = true;
               }
             } else {
                AIM_DEBUG(("Error: AIMImageGetBitmap(): Error extracting bitmap.\n"));
             }
           } else {
             AIM_DEBUG(("Error: AIMImageGetBitmap(): Invalid conversion paraeters.\n"));
           }
 
            *ppBitmap = pBitmap;
        } else {
          AIM_DEBUG(("Error: AIMImageGetBitmap(): Bad bitmap of image container.\n"));
        }
    } else {
        AIM_DEBUG(("Error: AIMImageGetBitmap(): Argument error.\n"));
    }
    return (ok);
}

结论

访问患者记录和查看医疗图像是完整的移动 EMR/EHR 解决方案的关键组成部分。但是,Android 环境本身并不支持查看 JPEG 2000 和无损 JPEG 图像。Accusoft Pegasus 的移动 SDK 可帮助您克服此限制,并在医疗领域构建您的客户所需的应用程序,以最大限度地提高生产力。

您可以在 www.accusoft.com 上找到 Accusoft Pegasus 的产品下载和功能。在 http://demos.accusoft.com/barcodexpressdemo 上探索我们的条形码 Web 演示,以测试我们的条形码识别准确性,或者在 http://www.accusoft.com/barcodemobiledemo.htm 下载我们的移动条形码 SDK Barcode Xpress Mobile 的试用版。AIMTools 演示视频和 SDK 下载可在 http://www.accusoft.com/aimtools.htm 获取。请联系info@accusoft.com了解更多信息。

即将推出。

在第二部分中,我们将讨论如何使用 iOS 设备(如 Apple 的 iPad 和 iPhone 产品)访问医疗记录。Accusoft Pegasus 已发布适用于 iOS 的 AIMTools,并将在未来几个月内发布适用于 iOS 的 Barcode Xpress Mobile。我们希望您对这些解决方案和我们一样充满期待!

关于 Accusoft Pegasus

Accusoft Pegasus 提供影像软件开发套件(SDK),可加速开发,并提供促进协作的查看器。当应用程序需要捕获、处理、存储和查看图像时,我们的代码会在后台可靠地工作。将条形码、压缩、DICOM、图像处理、OCR/ICR、表单处理、PDF、扫描、视频和图像查看功能添加到您的应用程序中。技术适用于多种 32 位/64 位平台和开发环境,包括 .NET、Silverlight、ASP.NET、iOS、Android、ActiveX、Java、Linux、Solaris、Mac OSX 和 IBM AIX。客户可以通过专业、内部团队获得卓越的技术支持和客户服务,这些团队致力于帮助满足他们的需求。在 www.accusoft.com 上查找无限的完整版试用 SDK 和演示。

关于作者

Rob Rimbold 是 Accusoft Pegasus 的高级软件工程师。他拥有超过 20 年的多学科软件开发经验。Rob 毕业于马萨诸塞州洛厄尔大学,获得计算机科学学士学位。

Scott Wilson 是 Accusoft Pegasus 的项目经理。他拥有超过 20 年的软件开发和管理经验。Scott 毕业于加拿大汉密尔顿麦克马斯特大学,获得理学学士学位。

Steve Wilson 是 Accusoft Pegasus 的产品组总监。Steve 负责领导团队开发新产品以及增强 Accusoft Pegasus 的多个产品线的功能集。他为管理团队带来了扎实的技术背景,以及管理多样化的离岸和 onshore 开发团队的经验。Steve 在南佛罗里达大学获得了计算机科学学士学位。

© . All rights reserved.