GVKun编程网logo

在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库(java调整图片大小)

1

如果您想了解在Java中调整图像大小并将图像作为BLOB返回到Oracle数据库和java调整图片大小的知识,那么本篇文章将是您的不二之选。我们将深入剖析在Java中调整图像大小并将图像作为BLOB返

如果您想了解在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库java调整图片大小的知识,那么本篇文章将是您的不二之选。我们将深入剖析在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库的各个方面,并为您解答java调整图片大小的疑在这篇文章中,我们将为您介绍在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库的相关知识,同时也会详细的解释java调整图片大小的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库(java调整图片大小)

在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库(java调整图片大小)

如何解决在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库

我在 Oracle 数据库和嵌入式 Java 类之间的交互方面遇到了另一个问题。 我想将图像(作为 blob)从数据库传递到 Java 类,在该类中图像被调整为所需的高度和宽度,然后图像作为 blob 传递回调用函数。

为了调整图像大小,我还在 www.codejava.net 找到了一个示例,该示例调整本地图像的大小并再次将其存储在本地。

这在本地也很有效。我的猫示例 - Jpg 被调整为原始尺寸的 50%(1024 x 811 WxH),即 512 x 405。 当然,这也减少了文件大小 - 在本例中从 192 KB 减少到 39 KB。

我改编的程序(见附件HKRCALL.java)也把从数据库传过来的BLOB,确定原图的大小, 计算宽度和高度的 50%,最后返回一个 blob。然后再次将其存储在表中。 我在我的 Java 程序中构建了一些输出,并让它们在 PL/sql 过程(依次调用 Java 类)的执行期间通过 dbms-Output 输出(见下文)。

不幸的是,这个 blob 的大小只有 3955 字节。

当我从数据库下载返回的图像时,确实是Jpeg,图像信息也显示尺寸为512 x 405。 不幸的是,图像是黑色的。

有人可以看看我的错误在哪里吗(ImageOutputStream?)? 我现在很绝望:-(

输出:

This ist the output:
resizeJpegCall: Size of the given blob: 194334
Original scaledWidth = 1024
Original scaledHeight = 811
50 % scaledWidth = 512
50 % scaledHeight = 405
resizeJpeg: BufferedImage outputimage
resizeJpeg: Graphics2D g2d = outputimage.createGraphics()
resizeJpeg: g2d.drawImage(inputimage,scaledWidth,scaledHeight,null)
resizeJpeg: g2d.dispose()
ImageIO.write(outputimage,JPG,ios)
Image resized successfully.
Image resized successfully.
Size of the return blob: 3955



    import java.sql.*; 
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import oracle.sql.*;
import oracle.jdbc.driver.*;
import java.sql.Blob;
import javax.imageio.stream.ImageOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
class HKRCALL{ 

 public static java.sql.Blob resizeJpegCall (java.sql.Blob blob   ) throws Exception{


    // Quality muss zwischen 0.01 und 1.00 liegen,als Parameter wird 0-100 mitgegeben,// daher hier noch mal durch 100 geteilt
    BufferedImage inputimage = ImageIO.read(blob.getBinaryStream()); 

    System.out.println("resizeJpegCall: Groesse des uebergebenen Blob: " + blob.length());              
     // Quality muss zwischen 0.01 und 1.00 liegen,// daher hier noch mal durch 100 geteilt
    float percent_float = (float) 0.50;
     System.out.println("Original scaledWidth = " + inputimage.getWidth());              
     System.out.println("Original scaledHeight = " + inputimage.getHeight()); 
      
     int scaledWidth = (int) (inputimage.getWidth() * percent_float );
     int scaledHeight = (int) (inputimage.getHeight() * percent_float );
     System.out.println("50 % scaledWidth = " + scaledWidth);              
     System.out.println("50 % scaledHeight = " + scaledHeight); 

    // blob fuer den returnwert wird ueber eine DB-Connection erstellt
    oracle.jdbc.OracleConnection conn =  (oracle.jdbc.OracleConnection)new OracleDriver().defaultConnection();
    java.sql.Blob retBlob = conn.createBlob();

    
    try {

   //       RenderedImage renderedImage = (RenderedImage)bufferedImage; 
          OutputStream os = retBlob.setBinaryStream(1L);
          ImageOutputStream ios = ImageIO.createImageOutputStream(os);
          
          /*
          In der Unterfunktion findet der eigentliche Resizen des JPEG statt

          */ 

          boolean result = resizeJpeg (inputimage,ios,scaledHeight )   ;
         if (result) {

            // display message when image is converted
            // successfully
            System.out.println("Image resized successfully.");
            System.out.println("Groesse des Return Blob: " + retBlob.length());              
           
           return retBlob;
        }
        else {

            // display message when image is not
            // converted successfully
            System.out.println( "Could not resize image.");
        }             
          
          

        } catch (IOException e) {
          // display message when excception is thrown
          System.out.println("Error during resizing image.");

          // Print the line number
          // where the exception occured

            e.printstacktrace();
        }
           catch (sqlException e) {
           e.printstacktrace();
        }
           catch(IllegalArgumentException e) {
           e.printstacktrace();
        }           
          return retBlob;
  } 


public static boolean resizeJpeg(BufferedImage inputimage,ImageOutputStream ios,int scaledWidth,int scaledHeight )  throws Exception{
 if ( inputimage == null )
    return false;
 if ( ios == null )
    return false;
 if ( scaledWidth == 0 )
    return false;        
 if ( scaledHeight == 0 )
    return false;             

    try {
        
    // creates output image
     System.out.println("resizeJpeg: BufferedImage outputimage");   
    BufferedImage outputimage = new BufferedImage(scaledWidth,inputimage.getType());

    // scales the input image to the output image
     System.out.println("resizeJpeg: Graphics2D g2d = outputimage.createGraphics()");   
    Graphics2D g2d = outputimage.createGraphics();

     System.out.println("resizeJpeg: g2d.drawImage(inputimage,null)");   
     g2d.drawImage(inputimage,null);

     System.out.println("resizeJpeg: g2d.dispose()");   
     g2d.dispose();


     System.out.println("ImageIO.write(outputimage,ios)");   
    ImageIO.write(outputimage,"jpg",ios);  



    return true;


    } catch (IOException e) {
          System.out.println("IOException");
        e.printstacktrace();
    return false;
    }
    catch(IllegalArgumentException e) {
        e.printstacktrace();
     return false;
    }
    finally {
        try {
            if (ios != null) {
                ios.flush();
                ios.close();
                System.out.println(
                "Image resized  successfully.");
             //return retBlob;
            }
        } catch (IOException e) {
            e.printstacktrace();
          return false;
        }
    }
    }

Android 返回到 backstack 中的 Activity 或打开它

Android 返回到 backstack 中的 Activity 或打开它

如何解决Android 返回到 backstack 中的 Activity 或打开它?

我在管理后台中的活动时遇到了困难。如果用户点击通知然后活动 B 被打开,在某个时候活动 B 将被关闭,我需要打开活动 A,但在这里我可以有两种情况,如果活动 A 已经打开并且在后台堆栈中,那么我想回到这个而不重新打开它,如果相反从未打开过活动A,那么我必须打开它。 我怎样才能做到这一点?

val notifyIntent = Intent(context,ActivityB::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
            putExtra(MODEL_KEY,model)
        }

        notificationmanagerCompat.from(context).notify(
            Date().time.toInt(),Builder(context,NotificationSettings.channelId)
                .setSmallIcon(NotificationSettings.smallIconId)
                .setContentTitle(remoteMessage.notification?.title ?: remoteMessage.data[BODY])
                .setContentText(remoteMessage.notification?.body ?: remoteMessage.data[SOURCE])
                .setStyle(
                    BigTextStyle().bigText(
                        remoteMessage.notification?.body ?: remoteMessage.data[SOURCE]
                    )
                )
                .setPriority(PRIORITY_DEFAULT)
                .setContentIntent(
                    getActivity(
                        context,notifyIntent,FLAG_UPDATE_CURRENT
                    )
                )
                .setAutoCancel(true).build()
        )

解决方法

您在 ActivityB 中使用此代码:

Intent intent = new Intent(this,ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
        Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

这将返回到 ActivityA 的前一个实例(并删除位于其顶部的任务堆栈中的任何其他活动),或者如果 ActivityA 中没有现有实例任务,然后它会创建一个新的。

,

简单的柠檬汁。

//this functions you put true if opened from notification
private boolean isOpenNotification;

@Override
public void onBackPressed() {
        if (isTaskRoot() && isOpenNotification) {
            finish();
            //open your activity here
        } else {
            setResult(RESULT_OK);
            super.onBackPressed();
        }
}
,

您可以通过以下方式实现这种行为:https://developer.android.com/training/notify-user/navigation#DirectEntry

App Auth Intent 返回到 App UI 问题

App Auth Intent 返回到 App UI 问题

如何解决App Auth Intent 返回到 App UI 问题

我正在将 App Auth 集成到我的 android 应用中以实现 SSO。我有一个问题,当身份验证意图或结束会话意图返回到应用程序时,转换真的很笨拙。库中的示例应用程序也是如此。

我想知道我们是否可以控制过渡?有没有办法让它成为更好的用户体验?

对于结束会话意图,返回应用程序时屏幕上出现黑色状态栏,有没有办法改善这种体验?

我知道这个问题可能看起来含糊不清或模棱两可,但更多的是可以做到这一点,如果可以,您能解释一下如何做。

AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API

AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API

如何解决AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API

我想使用 API Gateway 向 SQS 发送消息,然后需要触发 Lambda。在 Lambda 中完成计算后,我需要将结果传回 API Gateway。换句话说,是这样的:

  1. Get request --> Gateway API --> SQS --> Lambda --> (back to the same SQS?) --> Gateway API

我已经设置了所有必要的权限,这意味着我可以调用网关 API 并向 SQS 发送消息,然后 SQS 将其发送给 Lambda(我可以在 Cloudwatch 中看到 Lambda 收到了消息)。但是,我无法将 Lambda 响应返回给网关 API...

有人对此有一些建议/教程/博客文章吗?我观看了各种 YouTube 视频并搜索了 SO 上的帖子,但没有找到解决我的问题的方法。

解决方法

AWS Lambda 可以处理大量并发调用。默认值为 1000(一千),可以通过支持票 to "Hundreds of thousands" 增加。

如果您想使用 SQS 来平滑间歇性请求峰值,那么 Lambda 函数调用将与调用方/客户端的 API 网关调用异步,您需要使用其他方式来反馈向 API 网关调用方/客户端发送 Lambda 调用结果。

其中一种可能是回调 URL,您的 Lambda 在处理调用后将在调用方/客户端调用该 URL。或者您可以将 lambda 调用结果存储在某处(例如 S3 或 DynamoDB),调用方/客户端可以使用轮询定期询问调用结果(检查它是否准备好,如果准备好,则检索它)。

无论哪种方式,一旦您使用 SQS 将 API 网关调用与您的 Lambda 函数通过 SQS 消息对这些调用的处理分离,那么对 Lambda 调用的处理将异步 到 API 网关调用方/客户端请求。因此,API Gateway 调用方/客户端的 HTTP 请求将立即返回,无需等待 Lambda 调用结果。

Azure Blob 存储 - 如何在上传 Blob 后获取 Blob 存储 ID?

Azure Blob 存储 - 如何在上传 Blob 后获取 Blob 存储 ID?

如何解决Azure Blob 存储 - 如何在上传 Blob 后获取 Blob 存储 ID?

我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数据库中。如何找到保存的项目的 ID。这是命令:

Azure.Response<BlobContentInfo> blobs = containerClient.UploadBlob(fileName,outStream);

我似乎在返回的对象中找不到它

https://docs.microsoft.com/en-us/dotnet/api/azure.storage.blobs.models.blobcontentinfo?view=azure-dotnet

我的原始图片是使用 PowerApps 创建和保存的,其中控件确实返回 Blob ID - 见下文:

 Set(
        gblSentBlob,AzureBlobStorage.CreateFile(
            Text(gblAzureFileContainer),GUID() & ".jpg",camControl.Photo
        )
    );
    If(
        !IsEmpty(gblSentBlob),Notify("Picture saved to Azure storage:" & gblSentBlob.displayName);
        UpdateContext({locFileName: gblSentBlob.displayName});
        UpdateContext({locAzureStorageID: Text(gblSentBlob.Id)}); // <- *** this is the Blob ID ***
        UpdateContext({locSavedToAzure: true});

这里,AzureBlobStorage.CreateFile 函数返回一个包含我要查找的 ID 的对象。

如何在我的控制台应用程序中获取此 ID。

典型的 Blob ID 如下所示:

JTJmc2hpcmVibG9iY29udGFpbmVyJTJmNTk3MzQ4NGYtNGVhNy00NzJkLTkyMzQtYWIwNzM5NWNlOGRiLmpwZw==

然后我可以使用以下(在 PowerApps 中)检索要显示的图像

AzureBlobStorage.GetFileContent(ThisItem.BlobStorageID)

我的完整代码:

 var blobClient = containerClient.GetBlobClient(blobName);
                using Stream stream = await blobClient.OpenReadAsync();
                Image myImage = Image.FromStream(stream);
                Image myThumbnail = PictureProcessor.returnThumbnail(myImage);
                // Now save this image
             
                string guid = Guid.NewGuid().ToString();
                string fileName = guid + ".jpg";
                //create a memory stream ready for the rescaled image
                Stream outStream = new MemoryStream();
                
                myThumbnail.Save(outStream,System.Drawing.Imaging.ImageFormat.Jpeg);

                Console.WriteLine(
                    "Length = {0},Position = {1}\\n",outStream.Length.ToString(),outStream.Position.ToString());

                outStream.Position = 0;
                Azure.Response<BlobContentInfo> blobs = containerClient.UploadBlob(fileName,outStream);

                Console.WriteLine("blobs RETURN OBJECT: " + blobs.ToString());
                Console.WriteLine("blobs GetRawResponse: " + blobs.GetRawResponse());
                
                Console.ReadKey();

解决方法

当我将其从 Base64 解码然后解码为 UTF-8 时:

JTJmc2hpcmVibG9iY29udGFpbmVyJTJmNTk3MzQ4NGYtNGVhNy00NzJkLTkyMzQtYWIwNzM5NWNlOGRiLmpwZw==

我明白了:

%2fshireblobcontainer%2f5973484f-4ea7-472d-9234-ab07395ce8db.jpg

因此,您的“Blob ID”似乎是您传入 AzureBlobStorage.CreateFile 的 URL 编码字符串值的 UTF-8(或 7 位 ASCII?)表示的 Base64 编码表示第二个参数。

这样做:

String powerAppsBlobId = @"JTJmc2hpcmVibG9iY29udGFpbmVyJTJmNTk3MzQ4NGYtNGVhNy00NzJkLTkyMzQtYWIwNzM5NWNlOGRiLmpwZw==";

Byte[] blobIdBytes = Convert.FromBase64String( powerAppsBlobId );

String urlEncodedBlobName = Encoding.UTF8.GetString( bytes );

String actualBlobName = Uri.UnescapeDataString( urlEncodedBlobName );

Console.WriteLine( actualBlobName )

这个程序会打印:

/shireblobcontainer/5973484f-4ea7-472d-9234-ab07395ce8db.jpg
,

在发布我的第一个答案(使用 Base64 解码)I took a look at the documentation for the Azure Blob connector for PowerApps 后,我发现 BlobMetadata.Name 和/或 BlobMetadata.Path 值也应该包含完整的 blob 名称.

我不知道你为什么指出 Azure.Storage.Blobs.Models 的文档,因为它不是供 PowerApps 使用的。

因此,更好的主意是在您从 PowerApps 中上传 blob 时存储 Blob.MetadataPath 值,以便您的控制台应用程序可以访问它 - 这是以防 PowerApps 更改其生成这些 Base64 的“算法” BlobId(例如,它们可以包含 Blob 版本日期+时间或共享访问签名)。

把你的代码改成这样:

 Set(
        gblSentBlob,AzureBlobStorage.CreateFile(
            Text(gblAzureFileContainer),GUID() & ".jpg",camControl.Photo
        )
    );
    If(
        !IsEmpty(gblSentBlob),Notify("Picture saved to Azure storage:" & gblSentBlob.DisplayName);
        UpdateContext({locFileName: gblSentBlob.DisplayName});
        UpdateContext({locAzureStorageID: Text(gblSentBlob.Id)});
        UpdateContext({locAzureStoragePath: Text(gblSentBlob.Path)}); // <--- Add this here
        UpdateContext({locSavedToAzure: true});

今天关于在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库java调整图片大小的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android 返回到 backstack 中的 Activity 或打开它、App Auth Intent 返回到 App UI 问题、AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API、Azure Blob 存储 - 如何在上传 Blob 后获取 Blob 存储 ID?的相关知识,请在本站搜索。

本文标签: