标签: bitmap

获取wpf WriteableBitmap的DrawingContext

有没有办法获得一个DrawingContext(或类似的)WriteableBitmap?也就是说允许你调用简单的DrawLine/ DrawRectangle/ etc类方法,而不是直接操作原始像素.

wpf drawing bitmap

20
推荐指数
4
解决办法
3万
查看次数

带有位图字体的C头文件

我需要对像素缓冲区做一些基本的文本渲染,我认为有一个用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)

我可以继续使用剩余的字母表,但后来我不需要问......但是这给了我一个想法!如果没有可用的位图字体的免费标题,每个答案都可以实现一个字母,我可以在这里组装整个文件^ _ ^

c fonts header bitmap

20
推荐指数
3
解决办法
2万
查看次数

在画布上绘制对象/图像

还有另一种在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是完美的工作,但我真的想画一个图像而不是椭圆形.:)

android google-maps bitmap

20
推荐指数
2
解决办法
8万
查看次数

触摸时使某个位图区域透明

我的想法是将两个图像重叠在一起,并且在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个图像在定义的半径上透明,我怎样才能使顶部位图透明?

android paint bitmap transparent

20
推荐指数
1
解决办法
3万
查看次数

如何创建Bitmap深层副本

我在我的应用程序中处理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深层副本.感谢那 :)

c# bitmap deep-copy

20
推荐指数
1
解决办法
1万
查看次数

可绘制与单个可重用位图更好的内存?

据我所知(并非我是正确的)当应用程序完成后,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)

但是,任何适用的见解都会非常受欢迎.谢谢

memory android bitmap recycle drawable

20
推荐指数
2
解决办法
1万
查看次数

Android:"尝试使用回收的位图"错误与临时位图

我的应用可以加载非常大的图像.为了保持记忆保守,我试图在转换后使用临时位图加载另一个用于最终图像:

.....
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()持有对它的引用,但为什么,以及持续多长时间?

android memory-management bitmap recycle

20
推荐指数
1
解决办法
7535
查看次数

Android:使用比双线性更好的重采样算法调整位图大小(如Lanczos3)

是否有任何方法或外部库可以使用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)?

android bitmap bicubic image-resizing lanczos

20
推荐指数
2
解决办法
4374
查看次数

如何在JavaFX中从剪贴板正确获取图像?挣扎的应用程序与不挣扎的应用程序之间有什么区别?

问题

JavaFX从Windows剪贴板获取图像的默认方式,

Clipboard.getSystemClipboard().getImage();
Run Code Online (Sandbox Code Playgroud)

,似乎已损坏。

图像的透明度似乎出了点问题。设置在黑色背景上,图像看起来不错,但是设置在白色背景上,什么也没有显示。

通过将应用程序的背景从黑暗更改为明亮来显示JavaFX图像透明性问题。

您可以使用以下最小,完整,可验证的示例测试剪贴板。

环境:Windows 7,Java 8更新202

我知道的

下面,我将描述我已经知道的事情。

还有其他人问过类似的问题:

然而,没有人成为问题的核心或得到答案。

没有官方错误

我似乎在Java错误数据库中找不到与此问题有关的错误

AWT没问题

在AWT剪贴板上不会出现图像问题,但是我想要一个使用JavaFX剪贴板的解决方案。

右侧是AWT剪贴板中的图像,左侧是JavaFX剪贴板中的相同图像。

剪贴板包含多种格式

我知道Windows剪贴板包含同一事物的多个版本,只是格式不同。使用InsideClipboardFree Clipboard Viewer可以很容易地看到

InsideClipboard的屏幕快照,显示CF_DIB格式。

JavaFX Clipboard可以识别某些格式。有时,它们的名称不同。application/x-java-rawimage是Java认为的图像;在代码中,您将此称为DataFormat.IMAGE

我怀疑DIBWindows中的剪贴板格式与Java的格式匹配application/x-java-rawimage,但是在源代码中找不到这种格式的证明。

问题是广泛传播的

问题应用

对于将图像复制到剪贴板的各种应用程序,JavaFX似乎也存在相同的透明性问题:

memory clipboard javafx image bitmap

20
推荐指数
1
解决办法
374
查看次数

你如何在Android中为一个位图着色?

我使用以下调用在画布上绘制一个位图:

_playerImage = BitmapFactory.decodeResource(getResources(), R.drawable.player);
Run Code Online (Sandbox Code Playgroud)

我现在怎么能把这张图片变成白色?当敌人被子弹击中时,我正试图使图像像顶部卷轴一样闪烁白色.

我需要使用BitmapFactory以外的东西吗?

android image bitmap

19
推荐指数
1
解决办法
2万
查看次数