gpt4 book ai didi

java - 位图图像未正确渲染

转载 作者:行者123 更新时间:2023-12-01 12:28:05 25 4
gpt4 key购买 nike

我有这张图片

enter image description here

这只是一个向边缘变得更加透明的圆圈。如果我将此图像传输到屏幕上,我会看到以下内容:

enter image description here

有谁知道为什么我的图像会像这样绘制到屏幕上?以下是我的相关功能:

public void blit(Bitmap bitmap, int x, int y) {
int x0 = x;
int x1 = x + bitmap.width;
int y0 = y;
int y1 = y + bitmap.height;
if (x0 < 0)
x0 = 0;
if (y0 < 0)
y0 = 0;
if (x1 > width)
x1 = width;
if (y1 > height)
y1 = height;
int ww = x1 - x0;

for (int yy = y0; yy < y1; yy++) {
int tp = yy * width + x0;
int sp = (yy - y) * bitmap.width + (x0 - x);
tp -= sp;
for (int xx = sp; xx < sp + ww; xx++) {
int col = bitmap.pixels[xx];
if (col < 0 && (tp+xx) < pixels.length){
pixels[tp + xx] = normal(col, pixels[tp + xx]);
}
}
}
}
public static int normal(int a, int b) {
int aA = (a >> 24) & 0xff;
int aR = ((a & 0xff0000) >> 16);
int aG = ((a & 0xff00) >> 8);
int aB = (a & 0xff);

int bA = (b >> 24) & 0xff;
int bR = ((b & 0xff0000) >> 16);
int bG = ((b & 0xff00) >> 8);
int bB = (b & 0xff);

float alpha = aA / 255f;

if (aA == 255 || bA == 0){
return a;
}

float srcAlpha = aA * (1 / 255f);
float dstAlpha = bA * (1 / 255f);
int A = (int) (aA+bA*(1-srcAlpha));
int R = (int) (aR*srcAlpha+bR*dstAlpha*(1-srcAlpha));
int G = (int) (aG*srcAlpha+bG*dstAlpha*(1-srcAlpha));
int B = (int) (aB*srcAlpha+bB*dstAlpha*(1-srcAlpha));

return A << 24 | R << 16 | G << 8 | B;
}
//code for importing image
public static Bitmap getBitmap(String location){
try{
BufferedImage image = ImageIO.read(ImageHandler.class.getResource(location));

Bitmap bitmap = new Bitmap(image.getWidth(), image.getHeight());

for(int i = 0; i < image.getWidth(); i++){
for(int j = 0; j < image.getHeight(); j++){
int rgb = image.getRGB(i, j);
if(rgb != 0xFFFF00FF && rgb != 0xFF990099){
bitmap.setPixel(rgb, i, j);
}
}
}

return bitmap;
}catch(Exception e){
e.printStackTrace();
return null;
}
}

如果这个问题看起来很模糊,我真的很抱歉,我真的很迷失这个问题!先谢谢了。我个人认为答案就在于我实际上如何位图传输像素以及它们如何被覆盖。

更新

我一直在研究代码,如果我传入,则与未正确计算某个值有关

int colour = 0x80FF0000;

然后程序读取 alpha 为 128,但是,如果我传入:

int colour = 0x79FF0000;

Alpha 突然读取为 254,因此导致图像被截断。

float aA = (a >> 24) & 0x000000FF;

这就是我提取 alpha 的方法

float srcAlpha = aA / 255F;

我是如何提取源alpha的

编辑2

问题不在于舍入,而在于缓冲。

buffer.renderTest(); //buffer is of type Bitmap

将在屏幕上完美渲染渐变

Bitmap b = new Bitmap(buffer.width, buffer.height);
b.renderTest();
buffer.blit(b, 0, 0);

但是一旦透明度低于 0x79000000 就会切断这是否意味着问题出在我的 blit 函数上?

最佳答案

在您的 blit 函数中:

if (col < 0 && (tp+xx) < pixels.length){
pixels[tp + xx] = normal(col, pixels[tp + xx]);
}

这不会处理透明度,因为 col 可能大于 0。

if ((tp+xx) < pixels.length){
pixels[tp + xx] = normal(col, pixels[tp + xx]);
}

这就是所需要的一切..

关于java - 位图图像未正确渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26180897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com