有没有办法获得一个DrawingContext(或类似的)WriteableBitmap?也就是说允许你调用简单的DrawLine/ DrawRectangle/ etc类方法,而不是直接操作原始像素.
我需要对像素缓冲区做一些基本的文本渲染,我认为有一个用char索引的表,字母表示为二进制数组就足够了......有人知道这样的免费标题吗?
例:
char data[256][8][8];
void init()
{
data['a'] = {
{0,0,1,1,1,0,0,0},
{0,1,0,0,0,1,0,0},
{0,0,0,0,0,0,1,0},
{0,0,1,1,1,0,1,0},
{0,1,0,0,0,1,1,0},
{0,1,0,0,0,0,1,0},
{0,1,0,0,0,1,1,0},
{0,0,1,1,1,0,1,0},
};
}
Run Code Online (Sandbox Code Playgroud)
我可以继续使用剩余的字母表,但后来我不需要问......但是这给了我一个想法!如果没有可用的位图字体的免费标题,每个答案都可以实现一个字母,我可以在这里组装整个文件^ _ ^
还有另一种在android中的画布上绘制对象的方法吗?
draw()中的这段代码不起作用:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null); Run Code Online (Sandbox Code Playgroud)
实际上,它正在处理我的第一个代码,但是当我将它转移到另一个名为MarkOverlay的类时,它就不再起作用了.
markerOverlay = new MarkerOverlay(getApplicationContext(), p);
listOfOverlays.add(markerOverlay); Run Code Online (Sandbox Code Playgroud)
我应该将哪个参数传递给MarkerOverlay以使此代码有效?错误发生在getResources()中.
仅供参考,canvas.drawOval是完美的工作,但我真的想画一个图像而不是椭圆形.:)
我的想法是将两个图像重叠在一起,并且在onTouch上,顶部图像应该在触摸的半径上变得透明,从而暴露底部图像.
这是我叠加2张图片的方式:
Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(bmp1, new Matrix(), null);
canvas.drawBitmap(bmp2, new Matrix(), null);
Run Code Online (Sandbox Code Playgroud)
我已经查看了这篇文章,并在下面使用Paint来使其透明:
mPaint = new Paint();
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
mPaint.setColor(Color.TRANSPARENT);
mPaint.setAntiAlias(true);
public void onDraw(Canvas canvas) {
canvas.drawCircle(40, 40, 30, mPaint); //hardcode to test
}
Run Code Online (Sandbox Code Playgroud)
问题是,我认为圆圈直接使2个图像在定义的半径上透明,我怎样才能使顶部位图透明?
我在我的应用程序中处理Bitmaps,出于某些目的,我需要创建Bitmap的深层副本.有一种优雅的方式怎么做?
我试过了
Bitmap deepCopy = original.Clone();
Run Code Online (Sandbox Code Playgroud)
,显然这不会创建一个深层副本,而是浅层副本.我的下一个尝试是创建一个新的位图
Bitmap deepCopy = new Bitmap(original);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个构造函数是Bitmap(Image),而不是Bitmap(Bitmap),而Bitmap(Image)会将我漂亮的8bppIndexed Pixelformat转换为另一个.
另一种尝试是使用MemoryStream
public static Bitmap CreateBitmapDeepCopy(Bitmap source)
{
Bitmap result;
using (MemoryStream stream = new MemoryStream())
{
source.Save(stream, ImageFormat.Bmp);
stream.Seek(0, SeekOrigin.Begin);
result = new Bitmap(stream);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
好吧,这也不起作用,因为必须在Bitmap的整个生命周期内打开MemoryStream.
所以,我总结了所有的后端,我真的很想看到一个很好的优雅方式来创建一个Bitmap深层副本.感谢那 :)
据我所知(并非我是正确的)当应用程序完成后,Drawable通常会从内存中正确删除.但是,位图需要手动回收,有时甚至会编写一个特殊的类来正确处理它们.我的问题是,关于内存和泄漏,简单地坚持像这样的Drawables是更有利的:
myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image));
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1));
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2));
Run Code Online (Sandbox Code Playgroud)
而不是使用Bitmaps这样的东西:
Bitmap tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
myView.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image1);
myView1.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image2);
myView2.setImageBitmap(tmpBitmap);
tmpBitmap.recycle();
Run Code Online (Sandbox Code Playgroud)
我当然也读过你必须要小心bitmaps上的recycle()方法,因为它们可以在使用时删除吗?似乎这些问题不断出现在不同的形式,但我无法真正得到任何人的直接答案.一个人说在每次使用后重复使用Bitmap并回收,其他人说使用Drawables和unbindDrawables()方法(这是我一直在使用的):
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,任何适用的见解都会非常受欢迎.谢谢
我的应用可以加载非常大的图像.为了保持记忆保守,我试图在转换后使用临时位图加载另一个用于最终图像:
.....
finalBitmap.recycle();
finalBitmap = null;
Bitmap tempBitmap = BitmapFactory.decodeStream(fin, ...);
finalBitmap = Bitmap.createBitmap(tempBitmap, ....);
imgview.setImageBitmap(finalBitmap);
.....
Run Code Online (Sandbox Code Playgroud)
现在,我们已经完成了tempBitmap,只需要将解码后的Bitmap传输到createBitmap中的转换步骤.所以:
.....
tempBitmap.recycle();
tempBitmap = null;
.....
Run Code Online (Sandbox Code Playgroud)
并且......由于tempBitmap的回收,它因"尝试使用再循环位图"错误而崩溃.tempBitmap未显示,仅在此处使用.
这里出了什么问题?我应该只使用"finalBitmap"并依靠createBitmap来管理它(finalBitmap = Bitmap.createBitmap(finalBitmap,....))?我没有看到对tempBitmap的持续依赖会导致这样的失败.
编辑:是的,null赋值似乎导致适当的,最终的垃圾收集,但我很困惑,为什么临时Bitmap上的recycle()在这种情况下是如此有问题.我得到的印象是createBitmap()持有对它的引用,但为什么,以及持续多长时间?
是否有任何方法或外部库可以使用Lanczos(理想情况下)或至少bicubic alg 调整图像大小.Android下?(当然更快更好,但质量优先,处理时间次要)
我到目前为止所做的一切都是这样的:
Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
Run Code Online (Sandbox Code Playgroud)
然而,它使用双线性滤波器,输出质量很差.特别是如果你想保留细节(如细线或可读文本).
有许多优秀的Java库,例如这里讨论的: Java - 调整图像大小而不会降低质量
但是它总是依赖于Java awt类java.awt.image.BufferedImage,所以它不能在Android中使用.
有没有办法如何更改Bitmap.createScaledBitmap()方法或某些库中的默认(双线性)过滤器,如Morten Nobel的lib,它能够与android.graphics.Bitmap类一起工作(或者有一些原始表示,如评论中指出的@Tron)?
JavaFX从Windows剪贴板获取图像的默认方式,
Clipboard.getSystemClipboard().getImage();
Run Code Online (Sandbox Code Playgroud)
,似乎已损坏。
图像的透明度似乎出了点问题。设置在黑色背景上,图像看起来不错,但是设置在白色背景上,什么也没有显示。
您可以使用以下最小,完整,可验证的示例测试剪贴板。
环境:Windows 7,Java 8更新202
下面,我将描述我已经知道的事情。
然而,没有人成为问题的核心或得到答案。
我似乎在Java错误数据库中找不到与此问题有关的错误。
在AWT剪贴板上不会出现图像问题,但是我想要一个使用JavaFX剪贴板的解决方案。
我知道Windows剪贴板包含同一事物的多个版本,只是格式不同。使用InsideClipboard或Free Clipboard Viewer可以很容易地看到它。
JavaFX Clipboard可以识别某些格式。有时,它们的名称不同。application/x-java-rawimage是Java认为的图像;在代码中,您将此称为DataFormat.IMAGE。
我怀疑DIBWindows中的剪贴板格式与Java的格式匹配application/x-java-rawimage,但是在源代码中找不到这种格式的证明。
对于将图像复制到剪贴板的各种应用程序,JavaFX似乎也存在相同的透明性问题:
我使用以下调用在画布上绘制一个位图:
_playerImage = BitmapFactory.decodeResource(getResources(), R.drawable.player);
Run Code Online (Sandbox Code Playgroud)
我现在怎么能把这张图片变成白色?当敌人被子弹击中时,我正试图使图像像顶部卷轴一样闪烁白色.
我需要使用BitmapFactory以外的东西吗?