如果您想了解在Java中调整图像大小并将图像作为BLOB返回到Oracle数据库和java调整图片大小的知识,那么本篇文章将是您的不二之选。我们将深入剖析在Java中调整图像大小并将图像作为BLOB返
如果您想了解在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库和java调整图片大小的知识,那么本篇文章将是您的不二之选。我们将深入剖析在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库的各个方面,并为您解答java调整图片大小的疑在这篇文章中,我们将为您介绍在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库的相关知识,同时也会详细的解释java调整图片大小的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- 在 Java 中调整图像大小并将图像作为 BLOB 返回到 Oracle 数据库(java调整图片大小)
- Android 返回到 backstack 中的 Activity 或打开它
- App Auth Intent 返回到 App UI 问题
- AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API
- Azure Blob 存储 - 如何在上传 Blob 后获取 Blob 存储 ID?
在 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 或打开它?
我在管理后台中的活动时遇到了困难。如果用户点击通知然后活动 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 集成到我的 android 应用中以实现 SSO。我有一个问题,当身份验证意图或结束会话意图返回到应用程序时,转换真的很笨拙。库中的示例应用程序也是如此。
我想知道我们是否可以控制过渡?有没有办法让它成为更好的用户体验?
对于结束会话意图,返回应用程序时屏幕上出现黑色状态栏,有没有办法改善这种体验?
我知道这个问题可能看起来含糊不清或模棱两可,但更多的是可以做到这一点,如果可以,您能解释一下如何做。
AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API
如何解决AWS API 网关 + SQS + Lambda + 将响应从 Lambda 返回到 API
我想使用 API Gateway 向 SQS 发送消息,然后需要触发 Lambda。在 Lambda 中完成计算后,我需要将结果传回 API Gateway。换句话说,是这样的:
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?
我正在使用 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?的相关知识,请在本站搜索。
本文标签: