由于面部检测器仅适用于jpg文件,如何使其适用于所有格式?我让用户从SD卡中选择任何图像,因此图像可以是任何格式.比我在本文中提到的使用decodefile方法缩小图像: Android:将大型位图文件调整为缩放输出文件
我的问题是:
我们可以在decodefile方法中添加一些方法来首先将图像转换为jpg吗?
将图像转换为jpg的最佳和最有效的方法是什么,以便面部检测器类检测面部?
我的代码到目前为止:
public FaceView(Context context) {
super(context);
File photo = new File(selectedImagePath);
sourceImage = decodeFile(photo);
picWidth = sourceImage.getWidth();
picHeight = sourceImage.getHeight();
sourceImage = Bitmap.createScaledBitmap (sourceImage, picWidth, picHeight, false);
arrayFaces = new FaceDetector( picWidth, picHeight, NUM_FACES );
arrayFaces.findFaces(sourceImage, getAllFaces);
for (int i = 0; i < getAllFaces.length; i++)
{
getFace = getAllFaces[i];
try {
PointF eyesMP = new PointF();
getFace.getMidPoint(eyesMP);
eyesDistance[i] = getFace.eyesDistance();
Log.d("1st eye distance", "" + getFace.eyesDistance());
eyesMidPts[i] = eyesMP;
}
catch (Exception e)
{ …Run Code Online (Sandbox Code Playgroud) 在我们的程序中使用大量图像,我们在eyery Activity和Fragment中取消绑定,如下所示
protected void unbindDrawables(View view) {
if (view != null) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ImageView) {
ImageView imageView = (ImageView) view;
imageView.setImageDrawable(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
if (!(view instanceof AbsSpinner) && !(view instanceof AbsListView)) {
((ViewGroup) view).removeAllViews();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
像这样/sf/answers/474534721/说,但我使用mat发现该位图也使用了大量内存而不是发布.
Class Name | Objects | Shallow Heap | …Run Code Online (Sandbox Code Playgroud) 我有这个代码将opencv图像转换为位图:
void processimage(MAT imageData)
{
Gdiplus::Bitmap bitmap(imageData.cols,imageData.rows,stride, PixelFormat24bppRGB,imageData.data);
// do some work with bitmap
}
Run Code Online (Sandbox Code Playgroud)
当图像的大小是2748 X 3664时,它运行良好.但是我想要处理尺寸为1374 X 1832的图像,它不起作用.
错误是无效的参数(2).
我查了一下,可以确认:
在2748*3664:
在1374 X 1832
所以一切对我来说都是正确的,但它会产生错误.
有什么问题,我该如何解决?
根据答案解释了为什么我无法创建位图.我终于以这种方式实现了它:
Mat newImage;
cvtColor(imageData, newImage, CV_BGR2BGRA);
Gdiplus::Bitmap bitmap(newImage.cols,newImage.rows,newImage.step1(), PixelFormat32bppRGB,newImage.data);
Run Code Online (Sandbox Code Playgroud)
如此有效,我将输入图像转换为每像素4字节,然后使用转换为位图.
所有归功于Roger Rowland 的答案.
基本上我有640 x 480图像,我想使用drawBitmap缩放和绘制它.为简单起见,我只想说我有854 x 480安卓屏幕.这是我的代码
MainActivity.java
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new MainLayout(this));
}
}
class MainLayout extends RelativeLayout
{
public MainLayout(Context context)
{
super(context);
setWillNotDraw(false);
}
@Override
public void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background);
bitmap = Bitmap.createScaledBitmap(bitmap, 854, 480, true);
canvas.drawBitmap
(
bitmap,
null,
new Rect(0, 0, 854, 480),
null
);
}
}
Run Code Online (Sandbox Code Playgroud)
结果与我想要的不同.有什么建议吗?
我疯了.
这就是我在做什么
双击按钮并添加以下代码:
procedure TForm31.Button1Click(Sender: TObject);
var
BF: TBlobField;
BS: TStream;
BM: TBitmap;
begin
ClientDataset1.Open;
ClientDataset1.First;
BF := ClientDataSet1.FieldByName('Graphic') as TBlobField;
BS := ClientDataSet1.CreateBlobStream(BF, bmRead);
BS.Position := 0;
BM := TBitmap.Create;
try
BM.LoadFromStream(BS);
finally
BM.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)运行.当我这样做时,我得到"位图图像无效".
咦?这些数据多年来一直是位图 - 出了什么问题?
在部署之前,我使用XP VM和Vista VM对我的应用程序进行烟雾测试.这两款VM都使用32位色.不确定它是否有任何区别,但我正在使用VirtualBox.每台机器还分配2GB内存,2个处理器.XP有128MB的视频RAM,Vista 256(在每种情况下我可以设置它们的最大值).运行机器的桌面有6个内核和16GB内存.同样,不确定这些信息是否相关但谁知道.
以下是我使用的扩展方法,以便将一个Bitmap像素转换为可以直接使用的像素.因为,毕竟我们需要速度.速度是我们所需要的.油腻,速度快!和Bitmap.GetPixel是相反的.
public static ArgbColor[] GetPixels(this Bitmap bitmap)
{
ArgbColor[] results;
int width;
int height;
BitmapData bitmapData;
width = bitmap.Width;
height = bitmap.Height;
results = new ArgbColor[width * height];
bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
ArgbColor* pixelPtr;
pixelPtr = (ArgbColor*)(void*)bitmapData.Scan0;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
results[row * width + col] = *pixelPtr;
pixelPtr++;
}
} …Run Code Online (Sandbox Code Playgroud) 我被赋予了一个用Java编写程序的任务,该程序将图像存储到XML中,并从给定的XML提取原始图像中存储.
我已经在网上搜索了很多解决方案,但没有得到任何正确答案,我可以从中学到完整的转换过程,所以如果有人知道链接或有任何材料,请告诉我.
我读过有关Picasso图像下载lib但有一个问题我无法解决它.这是大图像下载.当我有大图像,即2000 x 1920时,它被压碎(内存不足).
我怎么能解决这个问题?
Picasso.with(上下文).load(myUrl).into(ImageView的);
我试图在C#中声明并初始化一个位图,但似乎找不到该库.它只是告诉我创建Bitmap类.即使using System.Drawing手动添加" "也没有效果.
using System.Drawing
...
Bitmap img = new Bitmap(500, 500);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我使用的是.NET Framework 4.5,据微软称:
.NET Framework
Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0
Run Code Online (Sandbox Code Playgroud)
如果不推荐使用,我如何使用.Net Framework 4.5在C#中创建位图?
基本上我是为Android 4.4.2锁屏背景添加一个壁纸选择器,当图像设置后我关闭屏幕然后重新开启以查看锁屏我的屏幕变黑并且logcat给我一个内存不足分配错误.到目前为止,我已经尝试使用Bitmap decodeFile(String pathName),我也重新使用Bitmap decodeFile(String pathName,Options opts),但结果是每次都相同...
以下是用于设置图像的原始方法:
private static final String WALLPAPER_IMAGE_PATH =
"/data/data/com.android.settings/files/lockscreen_wallpaper.png";
private KeyguardUpdateMonitorCallback mBackgroundChanger = new KeyguardUpdateMonitorCallback() {
@Override
public void onSetBackground(Bitmap bmp) {
if (bmp != null) {
mKeyguardHost.setCustomBackground(
new BitmapDrawable(mContext.getResources(), bmp));
}
else {
File file = new File(WALLPAPER_IMAGE_PATH);
if (file.exists()) {
mKeyguardHost.setCustomBackground(
new BitmapDrawable(mContext.getResources(), WALLPAPER_IMAGE_PATH));
}
else {
mKeyguardHost.setCustomBackground(null);
}
}
updateShowWallpaper(bmp == null);
}
};
Run Code Online (Sandbox Code Playgroud)
这是从案例1中调用的:
public void setCustomBackground(Drawable d) {
if (!mAudioManager.isMusicActive()) {
int mBackgroundStyle = Settings.System.getInt(mContext.getContentResolver(),
Settings.System.LOCKSCREEN_BACKGROUND_STYLE, 2);
int mBackgroundColor …Run Code Online (Sandbox Code Playgroud)